超大数据引发的频繁gc问题
上述监控:ps_scavenge 表示的是年轻代垃圾收集次数 ,PS_MARK_SWEEP 是 full_gc 次数
1、首先看gc.log
根据gc log,在上一次fullgc后,在一开始,young gc的频次还算相对正常。
但后续,开始出现毫秒级的gc频次。而且每次gc后,总堆的大小逐渐变大,说明发生了新生代晋升到老年代,而且紧跟着出现了full gc ,full gc 回收了近一半的内存。由此推测,应该是有短暂生命周期的大对象频繁被创建。因此,需要查下,这些大对象具体是什么。
2、获取堆内存储快照
(1)通过对gc日志的实时观察,发现频繁gc的现象是不规律的,也就是无法推断出下一次这种现象发生的时间。而且,多次young gc后,紧跟的fullgc相当快,大对象都被gc掉了,导致无法推断应该在何时dump堆内快照。
为解决该问题,通过 jstat -gutil 命令来实时观察堆内存的占用情况,看能否通过这个工具来分析出什么线索。