天天看點

日志列印及簡單的gc調優

最近在學習gc調優的相關知識,寫一篇文章來整理一下思路,同時供以後的參考。

在idea中,有兩種設定vm參數的方式,一種是通過help下的edit custom vm options下,設定相關參數。另一種是通過run下的edit configurations設定相關參數。

日志列印及簡單的gc調優

由于我們需要對gc進行調優,是以首先需要列印gc日志。通過在vm options中添加-XX:+PrintGCTimeStamps -XX:+PrintGCDetails。前者記錄了從jvm啟動開始到發生gc時的一個時間。後者表示詳細的gc資訊。以parallel收集器的gc日志為例。

1.186: [GC (Allocation Failure) [PSYoungGen: 24064K->3576K(27648K)] 24064K->5415K(90624K), 0.0104731 secs] [Times: user=0.02 sys=0.02, real=0.01 secs]

2.150: [GC (Allocation Failure) [PSYoungGen: 27640K->3576K(27648K)] 29479K->9961K(90624K), 0.0108785 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

2.568: [GC (Allocation Failure) [PSYoungGen: 27640K->3576K(27648K)] 34025K->15547K(90624K), 0.0116456 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

前面的時間及為時間戳所列印的内容。後面包括發生的gc類别,原因。young區的記憶體變化和堆記憶體的變化。發生此gc所花費的時間。時間同時精确到了使用者态(user)和核心态(sys)。

想要列印日志,除了上面兩個XX指令,還需确定一個gc日志的輸出位置,-Xloggc:C:\xxxx\xxxx\gc.log,文法如前,我輸出到了c盤桌面。輸出日之後,就可以根據日志相關内容進行一些調整。比如young gc發生的次數過多。可以嘗試改變YoungGenerationSizeIncrement的大小,減少young gc次數。但是這樣很不直覺,對于我這樣的初學者其實很困難。這時候就需要一些将gc日志可視化的工具。我個人比較推薦gceasy.io。它是一個線上gc日志分析網站。能将你的gc日志,生成一份報告。

日志列印及簡單的gc調優

比如我們調優時比較關心的資料,吞吐量及響應時間。從上圖能看到,我的程式的吞吐量是92(吞吐量=gc時間/(總運作時間)),平均響應時間是39毫秒。相對來講,如果你的程式比較注重一個運作的速度和效率,那麼吞吐量比較重要。如果你的程式更重視和使用者的互動,那麼響應時間比較重要。當然,我們更希望兩個參數都比較優秀,但是一般情況下,這兩者是存在一定沖突的。一般而言,并行parallel收集器系列在吞吐量上比較占優勢,而并發收集器(使用者程式和垃圾收集同時進行)g1,cms等在響應時間比較占優勢。但從我個人的這個程式比較來看,g1的整體性能似乎更占優勢,好于parallel組合。

日志列印及簡單的gc調優

同時,也可以生成各類gc的一個統計。比如我情況是配置設定失敗造成的gc9次,由metaspace(jdk8以下permgen及永久代)的限制引起的有兩次,其中有一次是fullgc。由此gceasy給我的建議(文檔開頭)是提高對metaspace的空間配置設定。-XX:MetaspaceSize 提高metaspace大小。更改後成功消去了兩次metespace gc吞吐量提高到大約百分之96左右。