回答
Young GC 执行时间过长就意味着新生代 GC 的效率不高。新生代的垃圾回收算法一般都是选择复制算法,复制算法分为标记和复制两个阶段,如果 GC 执行时间过程则可以向这两个方向去考虑。
- 标记阶段执行时间过长
在应用层首先排查是否有类重写了 finalize()
,如果有类重写了该方法,则需要考虑其他的方式来实现该业务逻辑了。
- 复制阶段执行时间过长
复制阶段过长一般情况下就是存活的对象太多了,我们可以降低它们的晋升阈值(-XX:MaxTenuringThreshold=15
),让这些对象晋升到老年代,减轻年轻代的压力。
查看是否 GC 执行的线程数不够,如果是线程数不够,则可以适当提高 GC 执行线程数(-XX:ParallelGCThreads=4
),一般建议设置为 CPU 核心数的一半到全部。
关于 Young GC 的排查,实际情况会更加复杂,大明哥推荐两篇文章: