JVM GC調優實戰

從實例出發
新建一個空的 SpringBoot 項目, 比如 http://www.lxweimin.com/p/2ba67caabcea

啟動運行時加一些參數 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc -Xloggc:gc.log

加 VM 參數

- XX:+PrintGCDetails 該選項用于記錄 GC 運行時的詳細數據信息并輸出,是最基本、使用最普遍的一個選項。這個選項適用于所有 GC,輸出內容主要包括新生成對象占用內存大小以及耗費時間、各個年 齡代的情況、每次回收的對應數據等。
-verbose:gc -Xloggc:gc.log 運行后會在項目文件夾下面生成一 個 gc.log 文件

啟動項目,查看 gc.log 文件

gc.log

Parallel GC 是 JDK7 之后的默認 GC,它通過多線程方式減緩了獨占式 GC 的副作用(停頓時間比較長)。年輕代和老年代在 Parallel GC 里都是并行執行且獨占的,老年代也執行了壓縮操作,這個壓縮操作指的是移動存活對象到相鄰位置,這樣可以減少內存浪費,更好地實現內存布局 。
-XX:+UseCompressedOops 這個可以壓縮指針,起到節 約內存占用的選項。 CompressedOops 的實現方式是在機器碼中植入壓縮與解壓指令,可能會給 NM 增加額外的開銷 。
-XX:+UseCompressedClassPointers 選項是在 JDK8 出現的,也是在永久 區消失之后出現的新的選項,主要用于對類的元數據進行壓縮 。

GC 詳細日志解讀

日志釋義

簡單調優

下面是應用啟動的日志

***
2018-10-11 14:47:44.561  INFO 9242 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-10-11 14:47:44.565  INFO 9242 --- [           main] com.example.gcdemo.GcDemoApplication     : Started GcDemoApplication in 4.139 seconds (JVM running for 4.801)
2018-10-11 14:47:44.944  INFO 9242 --- [on(4)-127.0.0.1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-10-11 14:47:44.944  INFO 9242 --- [on(4)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
***

應用啟動花費了 4.139 秒,查看 gc.log 日志

應用啟動 GC 日志

啟動過程中總共進行了 10 次 GC, 包括兩次 Full GC, YoungGen 進行了 4 次擴容,所以為了加快啟動時間,嘗試一下加大初始化內存大小,減少 GC 發生次數,啟動參數添加 -Xms1536m -Xmx1536m

再次啟動

***
2018-10-11 16:37:22.078  INFO 9422 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-10-11 16:37:22.081  INFO 9422 --- [           main] com.example.gcdemo.GcDemoApplication     : Started GcDemoApplication in 3.373 seconds (JVM running for 3.788)
***
gc.log

GC 次數減少了一半, 啟動時間提升了 10%,感覺不明顯

內存再加大一倍 -Xms3096m -Xmx3096m

2018-10-11 16:44:15.991  INFO 9431 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-10-11 16:44:15.994  INFO 9431 --- [           main] com.example.gcdemo.GcDemoApplication     : Started GcDemoApplication in 3.358 seconds (JVM running for 3.971)
gc.log

啟動時間相比最開始提升了 19%

切換使用 G1GC

添加參數 -XX:+UseG1GC

2018-10-11 17:14:14.904  INFO 9517 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-10-11 17:14:14.908  INFO 9517 --- [           main] com.example.gcdemo.GcDemoApplication     : Started GcDemoApplication in 3.274 seconds (JVM running for 3.724)

又提升了一丟丟, 達到 21%, 不過 GC 日志就變得相當復雜了
gc.log
貼個外鏈
淺談 G1 GC 日志格式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評論 25 708
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,553評論 6 427
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,862評論 2 59
  • 本來想早睡的,躺著說看會書,就熬到了現在。無法描述此刻內心的感覺,想留下此刻的感覺然后忘掉,因為感覺并不是很...
    自由行走的雞蛋閱讀 253評論 0 0
  • 1.分苗池處理 a.進水消毒 一次性進水80至100公分,可以減少晝夜溫差。進水后消毒(永樂碘)放苗前2-3天曝氣...
    杰克高閱讀 338評論 0 0