JVM之优化吞吐量
对年轻代进行优化
优化吞吐量的目的其实是尽量少的Full GC ,或者尽量避免Full GC,有以下方法可以尽量减少Full GC:
- 增大Eden:你可以让eden空间更大,可以减少MinorGC的次数。我知道当对象的任期或者岁数达到一定值的时候就会移动到old代,而这个任期就是对象经历MinorGC的次数,MinorGC的次数越少,对象任期增长越慢,就有可能被MinorGC回收掉,而不是进入old代。
- 增大年轻代:这样同样能减少Minor GC 的频率,减慢对象进入老年代。
- 增大任期阈值:同样是延长对象在年轻代的停留时间,达到减少对象进入老年代的效果。
对老年代进行优化
- CMS
- 吞吐量垃圾回收器
扫描二维码关注公众号,回复:
517774 查看本文章
CMS吞吐量优化
- 额外命令
- 增加年轻代大小,减少Minor GC频率
- 增加老年代大小,减少Full GC的频率,减少碎片
- 优化堆大小,减少年轻代移动到老年代的对象
- 优化CMS周期启动
吞吐量垃圾回收器优化
- 关闭自适应大小(-XX:-UseAdaptiveSizePolicy),开启日志(-XX:+PrintGCDetails),自定义堆、年轻代比例
- 确定堆大小和老年代大小
- 查看GC日志,看Survivor是否溢出,加快Full GC,如果有溢出的情况,就要调整Survivor大小
Survivor溢出的例子:
2010-12-16T21:44:11.444-0600:
[GCAdaptiveSizePolicy::compute_survivor_space_size_and_thresh:
survived: 224408984
promoted: 10904856
overflow: false
[PSYoungGen: 6515579K->219149K(9437184K)]
8946490K->2660709K(13631488K), 0.0725945 secs]
[Times: user=0.56 sys=0.00, real=0.07 secs]
和以前不同的是,以GCAdaptiveSizePolicy开头的一些额外信息输出来了,survived标签表明“to” survivor空间的对象字节数。在这个例子中,survivor空间占用量是224408984字节,但是移动到old代的字节数却有10904856字节。overflow表明young代是否有对象溢出到old代,换句话说,就是表明了“to” survivor是否有足够的空间来容纳从eden空间和“from”survivor空间移动而来的对象。为了更好的吞吐量,期望在应用处于稳定运行状态下,survivor空间不要溢出。
如果Survivor溢出,如何优化
- 调整Survivor大小,同事要改大年轻代和堆的大小,以保证其他不变。
- 调整Survivor空间占用率,当占用率超过默认值(50%)时,会在对象达到最大岁数之前把对象移动到老年代去。
如果目标survivor空间的占用率没有通过-XX:TargetSurvivorRatio=<percent>指定,那么目标survivor空间的占用率是50%。
同样建议,HotSpot Vm使用默认的目标survivor空间占用率(50%),如果使用了-XX:TargetSurvivorRatio=<percent>,会使用<percent>作为MinorGC之后目标survivor空间占用率。如果survivor空间的占用率可能超过这个目标值,会在对象达到最大岁数之前把对象移动到old代去。
参考:
http://blog.csdn.net/zhoutao198712/article/details/7842500