JVM内存限制解决方案
众所周知,JVM内存是受限的,一为机器的体系架构,二为操作系统本身。x86,x86-64,SPARC,.....的内存映射是不同,而各操作系统的内存管理机制也有区别。
1.Heap设定与垃圾回收
JavaHeap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。
JVM的Heap分配可以使用-X参数设定
JVM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
为什么一些程序频繁发生GC?有如下原因:
◆程序内调用了System.gc()或Runtime.gc()。
◆一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
◆Java的Heap太小,一般默认的Heap值都很小。
◆频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。
经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3[2]。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成[2]。
注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
2.Stack的设定
每个线程都有他自己的Stack。
Stack的大小限制着线程的数量,也就是说会出现JVM内存限制。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
3.硬件环境
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。
4.4种GC
这里来看一下四种垃圾回收机制,通过JVM垃圾回收可以一定程度上解决JVM内存限制问题。
第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。
第二种为ThroughputGC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
第三种为ConcurrentLowPauseGC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
第四种为IncrementalLowPauseGC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
分享到:
相关推荐
标题中的“关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论”涉及了两个关键的IT概念:Tomcat服务器的字符编码问题和Java虚拟机(JVM)内存管理的问题。让我们逐一深入探讨这两个主题。 首先,我们来...
总之,MAT作为一款强大的JVM内存分析工具,对于优化Java应用的内存使用,提升应用性能,尤其是对于Mac OS X平台的开发者来说,是不可或缺的利器。通过熟练掌握MAT的使用,开发者可以更有效地管理和优化应用程序的...
- 永久代被移除,类元数据存储在元空间中,避免了JVM内存限制。 - 常量池从永久代移到了堆内存中。 3. JVM运行过程: - 类加载器加载类到元空间。 - Spring容器通过反射技术创建对象实例,对象存储在堆内存中。...
### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。
### MyEclipse内存不足与JVM内存管理 #### 1. 各个参数的含义 在探讨具体的参数之前,我们先来了解下JVM内存管理的基本...通过上述分析,我们可以更好地理解JVM内存管理机制以及如何解决MyEclipse内存不足的问题。
在Java开发过程中,对JVM(Java虚拟机)的监控是至关重要的,它能帮助我们了解应用程序的运行状态,优化性能,以及及时发现并解决内存泄漏等问题。`vmmap`工具是Mac OS X系统中一个强大的内存分析工具,它可以用来...
深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、垃圾收集机制以及相关工具的使用等方面进行详细的探讨。 一、JVM内存模型 JVM内存主要分为五个区域:...
理解JVM内存模型对于优化Java程序性能至关重要,合理分配和管理内存能有效避免内存泄漏和性能瓶颈。例如,通过调整堆大小、设置合理的垃圾回收策略,可以优化应用的运行效率。此外,了解这些内存区域的工作原理也能...
尽管如此,这种自动化管理也可能导致一些问题,如内存泄漏和内存溢出,尤其是在不了解JVM内存管理机制的情况下,这些问题往往难以定位和解决。 #### 二、JVM运行时数据区域详解 JVM在执行Java程序的过程中,会使用...
在了解JVM内存的高级概念之后,开发者能够更好地理解Java应用程序的性能问题,并采取措施优化JVM内存使用,例如调整堆内存大小、进行垃圾回收调优、使用本地内存优化技术以及提高代码效率。这有助于避免内存耗尽导致...
总之,理解和掌握JVM内存结构对于Java开发者来说是至关重要的,它可以帮助我们编写更高效、更稳定的代码,解决运行时可能出现的问题,并进行有效的性能调优。通过不断学习和实践,我们可以更好地驾驭这台强大的虚拟...
通过上述方法可以有效地解决Linux环境下Tomcat服务器中的JVM内存溢出问题。需要注意的是,内存优化是一个持续的过程,需要根据应用的具体情况不断调整和优化。此外,合理设计应用程序架构和代码逻辑也是减少内存消耗...
在Java 8之前,这部分被称为永久代,后来改为了元空间,以减少对JVM内存的限制。 6. **直接内存(Direct Memory)**:非JVM堆内存的一部分,但对性能有显著影响。通过NIO(New Input/Output)库可以直接在直接内存...
针对内存溢出的解决方案主要有两个方向: **1. 代码优化**: - 优化程序设计,减少全局变量的使用,确保对象在使用完毕后及时释放引用,以便垃圾收集器(GC)可以回收。 - 避免过度的内存消耗,如一次性加载大量...
《JVM内存模型深度探索——基于JDK源码解析》 在Java开发中,深入理解JVM(Java Virtual Machine)内存模型是至关重要的。本文将从JDK源码的角度出发,详细探讨JVM的内存结构、类加载机制以及对象创建与内存分配...
了解JVM内存模型对于开发者来说至关重要,因为它有助于识别和解决性能问题,如内存泄漏、栈溢出和垃圾收集效率低等问题。通过优化内存分配、管理对象生命周期和理解垃圾收集机制,我们可以显著提高Java应用的效率和...
### Apache服务器出现内存溢出的解决方法 #### 知识点概述 本文主要探讨了Apache服务器在运行过程中遇到内存溢出问题的几种常见情况及其解决办法。虽然标题提及的是Apache服务器,但文中实际讨论的是与Apache...
1. **大数据量处理**:当Kettle处理大量数据时,如在表输入、表输出、聚合、Join、过滤等步骤中,如果一次性加载太多数据到内存,可能会超出JVM的堆内存限制。 2. **内存管理不当**:Kettle的默认配置可能不适合特定...