一张PDF了解JDK9 GC调优秘籍-附PDF下载
文章目錄
- 簡介
- Oracle中的文檔
- JDK9中JVM參數(shù)的變化
- 廢棄的JVM選項
- 不推薦(Deprecated)的JVM選項
- 被刪除的JVM參數(shù)
- JDK9的新特性Application Class Data Sharing
- JDK9的新特性Xlog
- JDK9中的G1參數(shù)
- JDK9中的通用VM參數(shù)
- JDK9中的通用GC參數(shù)
- JDK9中的內(nèi)存調(diào)整參數(shù)
- 總結(jié)
簡介
今天我們講講JDK9中的JVM GC調(diào)優(yōu)參數(shù),JDK9中JVM的參數(shù)總共有2142個,其中正式的參數(shù)有659個。好像比JDK8中的參數(shù)要少一點。
為了方便大家的參考,特意將JDK9中的GC參數(shù)總結(jié)成了一張PDF,這個PDF比之前總結(jié)的JDK8的PDF在排版,顏色和內(nèi)容準(zhǔn)確性上面又有了非常大的提升,歡迎大家下載。
Oracle中的文檔
今天這篇文章的內(nèi)容都是從Oracle JDK9的官方文檔中提煉出來的。對于里面的內(nèi)容的真實性,我不能保證是100%正確的。
有人要問了,官網(wǎng)文檔也會有錯誤?
這個問題要從兩個方面說起,第一方面,任何人都會犯錯誤,雖然官網(wǎng)文檔經(jīng)過了編輯,校驗核對然后才發(fā)布,但是總會有一些遺漏的地方。
第二,Oracle的文檔是有專門的寫文檔的部門來專門編寫的,寫文檔就是他們的工作,所以,這些文檔并不是開發(fā)JDK的開發(fā)人員編寫的,而是和開發(fā)JDK不相關(guān)的文檔編寫員編寫的。
至于文檔寫完之后有沒有JDK開發(fā)人員過目,大家可以自行腦補…
所以古人說得好,盡信書不如無書。
JDK9中JVM參數(shù)的變化
一代新人換舊人,長江后浪推前浪。由來只有新人笑 有誰聽到舊人哭。
JDK9出現(xiàn)了,那么JDK8中的一些參數(shù)自然需要退伍了。
我們回想一下JDK9中有些什么變化呢?我總結(jié)一下有三個。
最大的變化就是引入了JPMS(Java Platform Module System)也就是Project Jigsaw。
模塊化的本質(zhì)就是將一個大型的項目拆分成為一個一個的模塊,每個模塊都是獨立的單元,并且不同的模塊之間可以互相引用和調(diào)用。
在module中會有元數(shù)據(jù)來描述該模塊的信息和該模塊與其他模塊之間的關(guān)系。這些模塊組合起來,構(gòu)成了最后的運行程序。
然后就是引入的Xlog日志服務(wù),通過Xlog日志服務(wù)我們可以監(jiān)控JVM中的事件,比如:GC,class loading,JPMS,heap,thread等等。
最后就是將String中的底層存儲從char數(shù)組換成了byte數(shù)組。
這三個變化中和JVM最相關(guān)的就是第二個Xlog日志服務(wù)。
廢棄的JVM選項
-Xusealtsigs / -XX:+UseAltSigs
這兩個選項在JDK9中被廢棄了,如果你不知道也沒關(guān)系,因為這兩個選項是在Oracle Solaris中專有的。現(xiàn)在用Solaris服務(wù)器的人應(yīng)該比較少了…
不推薦(Deprecated)的JVM選項
下面這些選項是JVM已經(jīng)不再推薦使用了,如果你使用的話也沒問題,但是會有報警。
Deprecated表示這些選項會在未來被刪除,我們應(yīng)該盡量避免使用這些選項。
選項有很多,我們挑一些比較常見和重要的來給大家講解一下。
-d32 / -d64
為什么這兩個參數(shù)會被不推薦呢?因為現(xiàn)在的服務(wù)器性能已經(jīng)非常非常的好了。
如果你的JDK是64位的,那么默認就啟用了-server和-d64模式,32位的JDK現(xiàn)在應(yīng)該很少見到了。
Oracle官方文檔說只有Java HotSpot Server VM才有64位的模式。不知道是真是假,因為其他的VM我也沒有用過,沒有發(fā)言權(quán)。
-Xloggc:garbage-collection.log
因為JDK9中引入Xlog框架,所以之前的日志輸出的參數(shù)都被替換成了新的Xlog格式:
比如上面的命令被替換成為 -Xlog:gc:garbage-collection.log
所以那些以Print開頭的GC日志輸出參數(shù)都是不推薦的。我們需要使用Xlog來替代。
同樣的以Trace開頭的運行時日志輸出參數(shù)也是不推薦的,也可以使用Xlog來替代。
-XX:+UseConcMarkSweepGC / -XX:CMS*
CMS在JDK9中是不被推薦的,所以CMS開頭的參數(shù)都不要用了。
-XX:+UseParNewGC
因為ParNewGC是和CMS一起使用的,所以CMS不推薦之后,ParNewGC也是不推薦使用的。
-XX:MaxPermSize=size / -XX:PermSize=size
JDK8中,Prem區(qū)已經(jīng)被移到了Metaspace,所以上面的參數(shù)可以被下面的替代:
-XX:MaxMetaspaceSize=size / -XX:MetaspaceSize=size
被刪除的JVM參數(shù)
-Xincgc
增量GC在JDK9中被刪除了。
-Xmaxjitcodesize=size JIT中最大的code cache大小被替換成 -XX:ReservedCodeCacheSize。
還有其他的一些CMS的參數(shù)。
JDK9的新特性Application Class Data Sharing
AppCDS的全稱是Application Class-Data Sharing。主要是用來在不同的JVM中共享Class-Data信息,從而提升應(yīng)用程序的啟動速度。
通常來說,如果要執(zhí)行class字節(jié)碼,JVM需要執(zhí)行下面的一些步驟:給定一個類的名字,JVM需要從磁盤上面找到這個文件,加載,并驗證字節(jié)碼,最后將它加載進來。
如果JVM啟動的時候需要加載成百上千個class,那么需要的就不是一個小數(shù)目了。
對于打包好的jar包來說,只要jar的內(nèi)容不變,那么jar包中的類的數(shù)據(jù)始終是相同的。JVM在啟動時候每次都會運行相同的加載步驟。
AppCDS的作用就是將這些能夠共享的數(shù)據(jù)歸類成一個存儲文件,在不同的JVM中共享。
下面是AppCDS的大概工作流程:
選擇要歸檔的class,并創(chuàng)建一個class的列表,用在歸檔中。( -XX:DumpLoadedClassList)
創(chuàng)建歸檔文件(-Xshare:dump和-XX:SharedArchiveFile)
使用歸檔文件(-Xshare:on 和 -XX:SharedArchiveFile)
相應(yīng)的VM參數(shù)如下:
JDK9的新特性Xlog
在java程序中,我們通過日志來定位和發(fā)現(xiàn)項目中可能出現(xiàn)的問題。在現(xiàn)代java項目中,我們使用log4j或者slf4j,Logback等日志記錄框架來處理日志問題。
JVM是java程序運行的基礎(chǔ),JVM中各種事件比如:GC,class loading,JPMS,heap,thread等等其實都可以有日志來記錄。通過這些日志,我們可以監(jiān)控JVM中的事件,并可以依次來對java應(yīng)用程序進行調(diào)優(yōu)。
在JDK9中引入的Xlog日志服務(wù)就是為這個目的而創(chuàng)建的。
通過xlog,JDK將JVM中的各種事件統(tǒng)一起來,以統(tǒng)一的形式對外輸出。通過tag參數(shù)來區(qū)分子系統(tǒng),通過log level來區(qū)分事件的緊急性,通過logging output來配置輸出的地址。
在JDK9之后,之前的Print*參數(shù)都被Xlog所代替了。
我們看下常用的Xlog和GC日志參數(shù):
JDK9中的G1參數(shù)
作為JDK9中的默認垃圾回收器G1,對G1的調(diào)優(yōu)是必不可少的。下面是G1的參數(shù):
JDK9中的通用VM參數(shù)
下面是通用的VM參數(shù):
JDK9中的通用GC參數(shù)
下面是JDK9中的通用GC參數(shù):
JDK9中的內(nèi)存調(diào)整參數(shù)
下面是JDK9中的內(nèi)存調(diào)整參數(shù):
總結(jié)
千言萬語不如一張PDF。我把JDK9的GC參數(shù)總結(jié)成了一張PDF,下面是PDF的下載鏈接。
JDK9GC-cheatsheet.pdf
歡迎大家下載。
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/jdk9-gc-cheatsheet/
本文來源:flydean的博客
歡迎關(guān)注我的公眾號:程序那些事,更多精彩等著您!
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的一张PDF了解JDK9 GC调优秘籍-附PDF下载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小师妹学JVM之:JIT中的PrintA
- 下一篇: 小师妹学JVM之:逃逸分析和TLAB