天天看點

Java虛拟機詳解(五)------JVM參數

JVM參數有很多,其實我們直接使用預設的JVM參數,不去修改都可以滿足大多數情況。但是如果你想在有限的硬體資源下,部署的系統達到最大的運作效率,那麼進行相關的JVM參數設定是必不可少的。下面我們就來對這些JVM參數進行詳細的介紹。

  JVM參數主要分為以下三種(可以根據書寫形式來區分):

1、标準參數

  标準參數,顧名思義,标準參數中包括功能以及輸出的結果都是很穩定的,基本上不會随着JVM版本的變化而變化。

  我們可以通過 -help 指令來檢索出所有标準參數。

  

Java虛拟機詳解(五)------JVM參數

  關于這些指令的詳細解釋,可以參考官網:​​https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html​​

  -help 也是一個标準參數,再比如使用比較多的 -version也是。

  ①、-version

  顯示Java的版本資訊。

  

Java虛拟機詳解(五)------JVM參數

2、X 參數

  對應前面講的标準化參數,這是非标準化參數。表示在将來的JVM版本中可能會發生改變,但是這類以 -X開始的參數變化的比較小。

  我們可以通過 Java -X 指令來檢索所有-X 參數。

  

Java虛拟機詳解(五)------JVM參數

  關于這些參數的介紹,其實上圖的中文解釋很清楚了,這裡我們不作過多的介紹。

3、XX參數

  這是我們日常開發中接觸到最多的參數類型。這也是非标準化參數,相對來說不穩定,随着JVM版本的變化可能會發生變化,主要用于JVM調優和debug。

  注意:這種參數是我們後續介紹JVM調優講解最多的參數。

  該參數的書寫形式又分為兩大類:

①、Boolean類型

  格式:-XX:[+-]<name> 表示啟用或者禁用name屬性。

  例子:-XX:+UseG1GC(表示啟用G1垃圾收集器)

②、Key-Value類型

  格式:-XX:<name>=<value> 表示name的屬性值為value。

  例子:-XX:MaxGCPauseMillis=500(表示設定GC的最大停頓時間是500ms)

4、參數詳解(持續更新)

  本節我們會持續更新羅列一些JVM參數。

1、列印已經被使用者或者目前虛拟機設定過的參數

-XX:+PrintCommandLineFlags      

  比如:

  

Java虛拟機詳解(五)------JVM參數

2、最大堆和最小堆記憶體設定

  -Xms512M:設定堆記憶體初始值為512M

  -Xmx1024M:設定堆記憶體最大值為1024M

  這裡的ms是memory start的簡稱,mx是memory max的簡稱,分别代表最小堆容量和最大堆容量。但是别看這裡是-X參數,其實這是-XX參數,等價于:

  -XX:InitialHeapSize

  -XX:MaxHeapSize

  在通常情況下,伺服器項目在運作過程中,堆空間會不斷的收縮與擴張,勢必會造成不必要的系統壓力。是以在生産環境中,JVM的Xms和Xmx要設定成一樣的,能夠避免GC在調整堆大小帶來的不必要的壓力。  

3、Dump異常快照以及以檔案形式導出

  -XX:+HeapDumpOnOutOfMemoryError

  -XX:HeapDumpPath

  堆記憶體出現OOM的機率是所有記憶體耗盡異常中最高的,出錯時的堆内資訊對解決問題非常有幫助,是以給JVM設定這個參數(-XX:+HeapDumpOnOutOfMemoryError),讓JVM遇到OOM異常時能輸出堆内資訊,并通過(-XX:+HeapDumpPath)參數設定堆記憶體溢出快照輸出的檔案位址,這對于特别是對相隔數月才出現的OOM異常尤為重要。

  這兩個參數通常配套使用:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./      

4、發送OOM後,執行一個腳本

  -XX:OnOutOfMemoryError

  比如這樣設定:

-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe"      

  表示發生OOM後,運作jconsole.exe程式。這裡可以不用加“”,因為jconsole.exe路徑Program Files含有空格。

  利用這個參數,我們可以在系統OOM後,自定義一個腳本,可以用來發送郵件告警資訊,可以用來重新開機系統等等。

5、列印gc資訊

  ①、列印GC簡單資訊

    -verbose:gc

    -XX:+PrintGC

  一個是标準參數,一個是-XX參數,都是列印詳細的gc資訊。通常會列印如下資訊:

  

Java虛拟機詳解(五)------JVM參數

  比如第一行,表示GC回收之前有12195K的記憶體,回收之後剩餘1088K,總共記憶體為125951K

  ②、列印詳細GC資訊

  -XX:+PrintGCDetails

  -XX:+PrintGCTimeStamps

  

Java虛拟機詳解(五)------JVM參數

6、指定GC日志以檔案輸出

  -Xloggc:./gc.log

  這個在參數用于将gc日志以檔案的形式輸出,更友善我們去檢視日志,定位問題。

7、設定永久代大小

  -XX:MaxPermSize=1280m

  在JDK1.7以及以前的版本中,隻有Hotspot 才有Perm區,稱為永久代,它在啟動時固定大小,很難進行調優。

  在某些情況下,如果動态加載類過多,容易産生Perm區的 OOM。比如某個實際 Web 工程中,因為功能點較多,在運作過程中,要不斷動态加載很多類,就會出現類似錯誤:

  "Exception in thread 'dubbo client x.x.connect' java.lang.OutOfMemoryError:PermGenspace"

  為了解決這個問題,就需要在項目啟動時,設定運作參數-XX:MaxPermSize。

  注意:在JDK1.8以後面的版本,使用元空間來代替永久代。在 JDK1.8以及後面的版本中,如果設定參數-XX:MaxPermSize,啟動JVM不會報錯,但是會提示:

  Java Hotspot 64Bit Server VM warning:ignoring option MaxPermSize=1280m:support was removed in 8.0

8、垃圾收集器常用參數

Java虛拟機詳解(五)------JVM參數

  

Java虛拟機詳解(五)------JVM參數