JVM调优之新生代的gc回收经验

首先:
       默认:
               Eden区:From Space区:To Space区=8x:x:x = 10x = 新生代

1、如果是临时变量多的接口,Eden一般占用可能也多,但是回收也快

      1.1、如果From Survivor空间和To Survivor空间不够用,常驻对象就会进入到老年代,这个时候如果Eden区够用,可以适当调大From Survivor空间和To Survivor空间的大小;如果Eden区也占用多,可以适当调大年轻代的内存占用大小;

      1.2、如果Survivor空间小了,对象又多,且没被回收,空间又不够,那么久晋升老年代,这种堆的老年代会呈现持续增长的趋态;此时调大Survivor空间大小,还在使用的临时对象会移动到To Survivor空间,下一次GC就可以回收掉上次使用,但现在不使用的对象;

      1.3、对于新生代控制比较好,gc能完全回收的,老年代占用一般比较少且空间稳定;

      1.4、对于虚拟机来说,复制对象的成本要远高于扫描成本,所以,单次Minor GC时间更多取决于GC后存活对象的数量,而非Eden区的大小。因此如果堆中短期对象很多,那么扩容新生代,单次Minor GC时间不会显著增加。

 

2、如果代码使用了JVM内存缓存,这种一般对象会常驻内存,不太容易被回收掉,很容易对象晋升至老年代,所以老年代的空间要保持够用;

 

3、调整比例可以先统计看下活跃常驻对象,临时对象的占比;根据程序稳定情况下的GC日志分析出来

 

上一篇:JVM 学习笔记(三)


下一篇:年轻代与老年代