首先看下jvm内存模型图
内存在survivor区进行正常的minorGC,minorGC触发时,暂停程序的时间较短 ,影响很小,但是当满足一定条件,比如经过from-to增长年龄之后,到了一定的年龄,就会转移到老年代,老年代内存接近满的时候会触发fullGC,fullGC则会stop the world,停止掉程序来进行垃圾回收。
使用命令查看线上问题:
jstat -gcutil pid 1000 10
通过该命令获取的信息,可以分析Eden区每秒或者设置的每分钟增长的新生代的大小。可根据该分析推测出Young GC的出发频率和每次耗时。
老年代fullGC之后仍然占用满的 下一步就会内存溢出 老年代都放不下了。
结合我们的jvm内存模型,内存在survivor区进行正常的minorGC,minorGC触发时,暂停程序的时间较短 ,影响很小,但是当满足一定条件,比如经过from-to增长年龄之后,到了一定的年龄,就会转移到老年代,老年代内存接近满的时候会触发fullGC,fullGC则会stop the world,停止掉程序来进行垃圾回收,上面的打印结果中FGC如果很多达到几百个,且空间并不释放,这时候内存已经占满,虚拟机内存溢出,程序不可正常使用了。
虚拟机内存配置--
使用gcutil选项 此示例附加到lvmid 21891 并以 250 毫秒的间隔采集 7 个样本,并显示-gcutil选项指定的输出。
jstat -gcutil 21891 250 7
S0 S1 EOP YGC YGCT FGC FGCT GCT
12.44 0.00 27.20 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 62.16 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 83.97 9.49 96.70 78 0.176 5 0.495 0.672
0.00 7.74 0.00 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 23.37 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 43.82 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 58.11 9.51 96.71 79 0.177 5 0.495 0.673
此示例的输出显示在第 3 个和第 4 个样本之间发生了一次年轻代收集。收集耗时 0.001 秒,将对象从 eden 空间 (E) 提升到 old 空间 (O),导致 old 空间利用率从 9.49% 提高到 9.51%。在收集之前,幸存者空间的利用率为 12.44%,但在此收集之后,它的利用率仅为 7.74%。