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