gc 调优


GC 调优策略

1. 降低 Minor GC 频率

由于新生代空间较小,Eden 区很快被填满,就会导致频繁 Minor GC,因此我们可以通过增大新生代空间来降低 Minor GC 的频率。

单次 Minor GC 时间更多取决于 GC 后存活对象的数量,而非 Eden 区的大小。

2. 降低 Full GC 的频率

通常情况下,由于堆内存空间不足或老年代对象太多,会触发 Full GC,频繁的 Full GC 会带来上下文切换,增加系统的性能开销。我们可以使用哪些方法来降低 Full GC 的频率呢?
减少创建大对象:在平常的业务场景中,我们习惯一次性从数据库中查询出一个大对象用于 web 端显示。例如,我之前碰到过一个一次性查询出 60 个字段的业务操作,这种大对象如果超过年轻代最大对象阈值,会被直接创建在老年代;即使被创建在了年轻代,由于年轻代的内存空间有限,通过 Minor GC 之后也会进入到老年代。这种大对象很容易产生较多的 Full GC。
我们可以将这种大对象拆解出来,首次只查询一些比较重要的字段,如果还需要其它字段辅助查看,再通过第二次查询显示剩余的字段。
增大堆内存空间:在堆内存不足的情况下,增大堆内存空间,且设置初始化堆内存为最大堆内存,也可以降低 Full GC 的频率。

3. 选择合适的 GC 回收器

对响应速度有要求的可以用 CMS(Concurrent Mark Sweep)回收器和 G1 回收器。
对系统吞吐量有要求时,可以选择 Parallel Scavenge。


文章作者:   future
版权声明:   本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 future !
 上一篇
锁优化 锁优化
垃圾回收会导致上下文切换很多 JVM 垃圾回收器(serial 收集器、ParNew 收集器)在回收旧对象时,会产生内存碎片,从而需要进行内存整理,在这个过程中就需要移动存活的对象。而移动内存对象就意味着这些对象所在的内存地址会发生变化,因
2020-09-04 future
下一篇 
jvm 命令 jvm 命令
jstat S1C:年轻代中 From Survivor 的容量(单位 KB); S0U:年轻代中 To Survivor 目前已使用空间(单位 KB); S1U:年轻代中 From Survivor 目前已使用空间(单位 KB); EC:
2020-09-04 future
  目录