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

簡介

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

爲了方便你們的參考,特地將JDK9中的GC參數總結成了一張PDF,這個PDF比以前總結的JDK8的PDF在排版,顏色和內容準確性上面又有了很是大的提高,歡迎你們下載。git

Oracle中的文檔

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

有人要問了,官網文檔也會有錯誤?數組

這個問題要從兩個方面提及,第一方面,任何人都會犯錯誤,雖然官網文檔通過了編輯,校驗覈對而後才發佈,可是總會有一些遺漏的地方。服務器

第二,Oracle的文檔是有專門的寫文檔的部門來專門編寫的,寫文檔就是他們的工做,因此,這些文檔並非開發JDK的開發人員編寫的,而是和開發JDK不相關的文檔編寫員編寫的。框架

至於文檔寫完以後有沒有JDK開發人員過目,你們能夠自行腦補......模塊化

因此古人說得好,盡信書不如無書。

JDK9中JVM參數的變化

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

JDK9出現了,那麼JDK8中的一些參數天然須要退伍了。spa

咱們回想一下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的博客

歡迎關注個人公衆號:程序那些事,更多精彩等着您!

相關文章
相關標籤/搜索