(1)线上GC情况
(2)GC单条日志分析
<code>2020-04-09T14:34:15.456+0800: 62982.576: [GC (Allocation Failure) 2020-04-09T14:34:15.456+0800: 62982.577: [ParNew: 1264923K->7719K(1415616K), 0.0092454 secs] 1558043K->300870K(1939904K), 0.0095074 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]/<code>
(3)GC (Allocation Failure)分析
(3.1)GC关键字
表明进行了一次垃圾回收,前面没有Full修饰,表明这是一次Minor GC ,注意它不表示只GC新生代,并且现有的不管是新生代还是老年代都会Stop The World。
(3.2)Allocation Failure:
表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。
(3.3)ParNew
ParNew表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX:ParallelGCThreads参数限制)。该收集器采用复制算法回收内存,期间会停止其他工作线程,即Stop The World。
(3.4)ParNew 新生代分析
<code>[ParNew: 1264923K->7719K(1415616K), 0.0092454 secs] [ParNew: 参数1->参数2(参数3), 参数4 secs] [参数1]:1264923K --- GC前该内存区域的大小 ---GC前1.2G [参数2]:7719K --- GC后该内存区域的大小 ---GC后0.007G [参数3]:1415616K --- 该区域分配的大小 ---新生代分配1.35G [参数3]:0.0092454 --- GC耗时,单位:秒/<code>
(3.5)ParNew 堆分析
<code>1558043K->300870K(1939904K), 0.0095074 secs 参数1->参数1(参数3), 参数4 secs [参数1]:1558043K --- 堆区垃圾回收前的大小 --- 1.485G [参数2]:300870K --- 堆区垃圾回收后的大小 --- 0.286G [参数3]:1939904K --- 该区域分配的大小 --- 1.85G [参数3]:0.0095074 --- GC耗时,单位: G/<code>
(3.6)数据分析
(3.6.1)新生代GC大小
<code>1264923 - 7719 = 1257204K/<code>
(3.6.2)HEAP区GC大小
<code>1558043 - 300870 = 1257173K/<code>
(3.6.3)进入老年代
<code>1257204 - 1257173 = 31K 说明该次共有31K内存从年轻代移到了老年代,可以看出来数量并不多,说明都是生命周期短的对象/<code>
(4)JVM参数分析
(4.1)查看系统参数
<code>ps -ef|grep java -Xms2048m : 设置JVM促使内存为2G,JVM启动时分配了2G内存 -Xmx2048m : 最大堆大小2G -Xmn1536m : 设置年轻代大小为1.5G -XX:+UseConcMarkSweepGC : 设置年老代为并发收集 -XX:MaxTenuringThreshold=15 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+PrintGCDetails/<code>
(4.2)Arthas查看GC相关参数
關鍵字: 大小 Allocation JVM