彻底掌握JVM内存设置

java中的数据处理大部分都在JVM的内存中完成的。

所以我们了解了jvm的内存构成后来,也能像架构师一样简单修改几个JVM参数,便能将程序运行的性能提升数倍。

先说明一下环境,JDK1.7的环境。先来了解一下JVM运行时内存的构成:

彻底掌握JVM内存设置

其中永久代占比超级小。接下来看看各个部分的功能:

彻底掌握JVM内存设置

新生代区域的对象是朝生夕死的特点,是主要垃圾回收的区域,设置该区域超级的重大。新生代通过eden、survivorfrom、survivorto这三个区的内存交换来完成垃圾回收的过程的。

彻底掌握JVM内存设置

Eden区的特点:java新创建的对象第一会存放在eden区,如果新创建的对象属于大对象,则直接将它分配到老年代,当然大对象的定义和具体的JVM版本、堆大小和垃圾回收的策略有关。一般为2KB~128KB,当然我们也可以通过PretenureSizeThreshold参数设置“大对象”的大小。当eden区的内存不足时,会触发MinorGC对新生代进行一次垃圾回收。

survivorfrom区,它指保留上一次MinorGC时幸存者;survivorto区则是把上一次MinorGC的幸存者作为这一次MinorGC的被扫描者。

最后说明一下新生代的对象的生命周期:JVM新生代对象的生命周期由MinorGC决定,在新生代,新创建的对象第一在eden区,当eden区没有足够的内存空间时,会触发MinorGC,由于MinorGC决定了新生代对象的生命周期,先看看MinorGC的简单原理。MinorGC采用的是复制算法。

彻底掌握JVM内存设置

MinorGC的过程分为三步:先把eden区域和servivorfrom区域中的存活的对象复制到servicorto区域,同时把这些对象的年龄加一,这时如果有对象的年龄达到了老年代的标准,或者servicorto的内存不足,就会把这部分的对象放到老年代;第二步,清空eden区域和servivorfrom中的对象;最后一步,servicorto和servivorfrom相互交换,原来servicorto区成为下一次GC时的servivorfrom区。

彻底掌握JVM内存设置

永久代主要存放Class文件和MetaData的信息,其中Class文件在类加载时 被放入永久代。永久代跟新生代和老年代是不同的,GC不会在程序运行期间对永久代进行清理,但永久代的内存会随着加载Class文件的增加而增加。加载Class文件过多时会抛出OOM异常。列如Tomcat引用的Jar过多,导致JVM内存不足,而无法启动。但java程序很少由于加载的Class文件过大而导致内存溢出或启动异常。因此永久代不是内存设置重点关注的地方。

彻底掌握JVM内存设置

彻底掌握JVM内存设置

JVM内存参数设置:重点关注堆内存的大小,和堆内存中新生代和老年代的内存大小设置,其他默认即可,来看下下图的一个简单示范。

彻底掌握JVM内存设置

一般我们把Xms和Xmx设置为一样的值。避免垃圾回收后JVM重新分配内存。

彻底掌握JVM内存设置

彻底掌握JVM内存设置

彻底掌握JVM内存设置

彻底掌握JVM内存设置

彻底掌握JVM内存设置

彻底掌握JVM内存设置

彻底掌握JVM内存设置

举一个简单的设置实战:如图。

彻底掌握JVM内存设置

彻底掌握JVM内存设置

一般的微服务程序没有大对象,所以1/3设置,survivor区和eden区和其他参数配置按官网默认,再加垃圾回收和OOM异常按常规配置一下。得出下面结论。

彻底掌握JVM内存设置

JVM内存设置是不是清晰许多。不过最后说明一下,保存操作系统的内存要足够。如果程序中有大量的新生对象的快速生成和回收,则适当将新生代内存调大,但不提议超过整个堆内存的2/3。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容