(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