從實例出發
新建一個空的 SpringBoot 項目, 比如 http://www.lxweimin.com/p/2ba67caabcea
啟動運行時加一些參數 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc -Xloggc:gc.log
- XX:+PrintGCDetails
該選項用于記錄 GC 運行時的詳細數據信息并輸出,是最基本、使用最普遍的一個選項。這個選項適用于所有 GC,輸出內容主要包括新生成對象占用內存大小以及耗費時間、各個年 齡代的情況、每次回收的對應數據等。
-verbose:gc -Xloggc: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
日志
啟動過程中總共進行了 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 次數減少了一半, 啟動時間提升了 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)
啟動時間相比最開始提升了 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 日志格式