1. 程式人生 > 實用技巧 >一張PDF瞭解JDK9 GC調優祕籍-附PDF下載

一張PDF瞭解JDK9 GC調優祕籍-附PDF下載

目錄

簡介

今天我們講講JDK9中的JVM GC調優引數,JDK9中JVM的引數總共有2142個,其中正式的引數有659個。好像比JDK8中的引數要少一點。

為了方便大家的參考,特意將JDK9中的GC引數總結成了一張PDF,這個PDF比之前總結的JDK8的PDF在排版,顏色和內容準確性上面又有了非常大的提升,歡迎大家下載。

Oracle中的檔案

今天這篇文章的內容都是從Oracle JDK9的官方檔案中提煉出來的。對於裡面的內容的真實性,我不能保證是100%正確的。

有人要問了,官網檔案也會有錯誤?

這個問題要從兩個方面說起,第一方面,任何人都會犯錯誤,雖然官網檔案經過了編輯,校驗核對然後才釋出,但是總會有一些遺漏的地方。

第二,Oracle的檔案是有專門的寫檔案的部門來專門編寫的,寫檔案就是他們的工作,所以,這些檔案並不是開發JDK的開發人員編寫的,而是和開發JDK不相關的檔案編寫員編寫的。

至於檔案寫完之後有沒有JDK開發人員過目,大家可以自行腦補......

所以古人說得好,盡信書不如無書。

JDK9中JVM引數的變化

一代新人換舊人,長江後浪推前浪。由來只有新人笑 有誰聽到舊人哭。

JDK9出現了,那麼JDK8中的一些引數自然需要退伍了。

我們回想一下JDK9中有些什麼變化呢?我總結一下有三個。

  1. 最大的變化就是引入了JPMS(Java Platform Module System)也就是Project Jigsaw。

    模組化的本質就是將一個大型的專案拆分成為一個一個的模組,每個模組都是獨立的單元,並且不同的模組之間可以互相引用和呼叫。

    在module中會有元資料來描述該模組的資訊和該模組與其他模組之間的關係。這些模組組合起來,構成了最後的執行程式。

  2. 然後就是引入的Xlog日誌服務,通過Xlog日誌服務我們可以監控JVM中的事件,比如:GC,class loading,JPMS,heap,thread等等。

  3. 最後就是將String中的底層儲存從char陣列換成了byte陣列。

這三個變化中和JVM最相關的就是第二個Xlog日誌服務。

廢棄的JVM選項

-Xusealtsigs / -XX:+UseAltSigs

這兩個選項在JDK9中被廢棄了,如果你不知道也沒關係,因為這兩個選項是在Oracle Solaris中專有的。現在用Solaris伺服器的人應該比較少了.....

不推薦(Deprecated)的JVM選項

下面這些選項是JVM已經不再推薦使用了,如果你使用的話也沒問題,但是會有報警。

Deprecated表示這些選項會在未來被刪除,我們應該儘量避免使用這些選項。

選項有很多,我們挑一些比較常見和重要的來給大家講解一下。

-d32 / -d64

為什麼這兩個引數會被不推薦呢?因為現在的伺服器效能已經非常非常的好了。

如果你的JDK是64位的,那麼預設就啟用了-server和-d64模式,32位的JDK現在應該很少見到了。

Oracle官方檔案說只有Java HotSpot Server VM才有64位的模式。不知道是真是假,因為其他的VM我也沒有用過,沒有發言權。

-Xloggc:garbage-collection.log

因為JDK9中引入Xlog框架,所以之前的日誌輸出的引數都被替換成了新的Xlog格式:

比如上面的命令被替換成為 -Xlog:gc:garbage-collection.log

所以那些以Print開頭的GC日誌輸出引數都是不推薦的。我們需要使用Xlog來替代。

同樣的以Trace開頭的執行時日誌輸出引數也是不推薦的,也可以使用Xlog來替代。

-XX:+UseConcMarkSweepGC / -XX:CMS*

CMS在JDK9中是不被推薦的,所以CMS開頭的引數都不要用了。

-XX:+UseParNewGC

因為ParNewGC是和CMS一起使用的,所以CMS不推薦之後,ParNewGC也是不推薦使用的。

-XX:MaxPermSize=size / -XX:PermSize=size

JDK8中,Prem區已經被移到了Metaspace,所以上面的引數可以被下面的替代:

-XX:MaxMetaspaceSize=size / -XX:MetaspaceSize=size

被刪除的JVM引數

-Xincgc

增量GC在JDK9中被刪除了。

-Xmaxjitcodesize=size JIT中最大的code cache大小被替換成 -XX:ReservedCodeCacheSize

還有其他的一些CMS的引數。

JDK9的新特性Application Class Data Sharing

AppCDS的全稱是Application Class-Data Sharing。主要是用來在不同的JVM中共享Class-Data資訊,從而提升應用程式的啟動速度。

通常來說,如果要執行class位元組碼,JVM需要執行下面的一些步驟:給定一個類的名字,JVM需要從磁碟上面找到這個檔案,載入,並驗證位元組碼,最後將它載入進來。

如果JVM啟動的時候需要載入成百上千個class,那麼需要的就不是一個小數目了。

對於打包好的jar包來說,只要jar的內容不變,那麼jar包中的類的資料始終是相同的。JVM在啟動時候每次都會執行相同的載入步驟。

AppCDS的作用就是將這些能夠共享的資料歸類成一個儲存檔案,在不同的JVM中共享。

下面是AppCDS的大概工作流程:

  1. 選擇要歸檔的class,並建立一個class的列表,用在歸檔中。( -XX:DumpLoadedClassList)

  2. 建立歸檔檔案(-Xshare:dump和-XX:SharedArchiveFile)

  3. 使用歸檔檔案(-Xshare:on 和 -XX:SharedArchiveFile)

相應的VM引數如下:

JDK9的新特性Xlog

在java程式中,我們通過日誌來定位和發現專案中可能出現的問題。在現代java專案中,我們使用log4j或者slf4j,Logback等日誌記錄框架來處理日誌問題。

JVM是java程式執行的基礎,JVM中各種事件比如:GC,class loading,JPMS,heap,thread等等其實都可以有日誌來記錄。通過這些日誌,我們可以監控JVM中的事件,並可以依次來對java應用程式進行調優。

在JDK9中引入的Xlog日誌服務就是為這個目的而建立的。

通過xlog,JDK將JVM中的各種事件統一起來,以統一的形式對外輸出。通過tag引數來區分子系統,通過log level來區分事件的緊急性,通過logging output來配置輸出的地址。

在JDK9之後,之前的Print*引數都被Xlog所代替了。

我們看下常用的Xlog和GC日誌引數:

JDK9中的G1引數

作為JDK9中的預設垃圾回收器G1,對G1的調優是必不可少的。下面是G1的引數:

JDK9中的通用VM引數

下面是通用的VM引數:

JDK9中的通用GC引數

下面是JDK9中的通用GC引數:

JDK9中的記憶體調整引數

下面是JDK9中的記憶體調整引數:

總結

千言萬語不如一張PDF。我把JDK9的GC引數總結成了一張PDF,下面是PDF的下載連結。

JDK9GC-cheatsheet.pdf

歡迎大家下載。

本文作者:flydean程式那些事

本文連結:http://www.flydean.com/jdk9-gc-cheatsheet/

本文來源:flydean的部落格

歡迎關注我的公眾號:程式那些事,更多精彩等著您!