JVM之优化吞吐量

JVM之优化吞吐量

对年轻代进行优化

优化吞吐量的目的其实是尽量少的Full GC ,或者尽量避免Full GC,有以下方法可以尽量减少Full GC:

  • 增大Eden:你可以让eden空间更大,可以减少MinorGC的次数。我知道当对象的任期或者岁数达到一定值的时候就会移动到old代,而这个任期就是对象经历MinorGC的次数,MinorGC的次数越少,对象任期增长越慢,就有可能被MinorGC回收掉,而不是进入old代。
  • 增大年轻代:这样同样能减少Minor GC 的频率,减慢对象进入老年代。
  • 增大任期阈值:同样是延长对象在年轻代的停留时间,达到减少对象进入老年代的效果。

对老年代进行优化

  • CMS
  • 吞吐量垃圾回收器

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

猜你喜欢

转载自youyu4.iteye.com/blog/2356359