JVM參數有不少,其實咱們直接使用默認的JVM參數,不去修改均可以知足大多數狀況。可是若是你想在有限的硬件資源下,部署的系統達到最大的運行效率,那麼進行相關的JVM參數設置是必不可少的。下面咱們就來對這些JVM參數進行詳細的介紹。html
JVM參數主要分爲如下三種(能夠根據書寫形式來區分):java
標準參數,顧名思義,標準參數中包括功能以及輸出的結果都是很穩定的,基本上不會隨着JVM版本的變化而變化。服務器
咱們能夠經過 -help 命令來檢索出全部標準參數。oracle
關於這些命令的詳細解釋,能夠參考官網:https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.htmljsp
-help 也是一個標準參數,再好比使用比較多的 -version也是。spa
①、-versiondebug
顯示Java的版本信息。日誌
對應前面講的標準化參數,這是非標準化參數。表示在未來的JVM版本中可能會發生改變,可是這類以 -X開始的參數變化的比較小。code
咱們能夠經過 Java -X 命令來檢索全部-X 參數。htm
關於這些參數的介紹,其實上圖的中文解釋很清楚了,這裏咱們不做過多的介紹。
這是咱們平常開發中接觸到最多的參數類型。這也是非標準化參數,相對來講不穩定,隨着JVM版本的變化可能會發生變化,主要用於JVM調優和debug。
注意:這種參數是咱們後續介紹JVM調優講解最多的參數。
該參數的書寫形式又分爲兩大類:
格式:-XX:[+-]<name> 表示啓用或者禁用name屬性。
例子:-XX:+UseG1GC(表示啓用G1垃圾收集器)
格式:-XX:<name>=<value> 表示name的屬性值爲value。
例子:-XX:MaxGCPauseMillis=500(表示設置GC的最大停頓時間是500ms)
本節咱們會持續更新羅列一些JVM參數。
一、打印已經被用戶或者當前虛擬機設置過的參數
-XX:+PrintCommandLineFlags
好比:
二、最大堆和最小堆內存設置
-Xms512M:設置堆內存初始值爲512M
-Xmx1024M:設置堆內存最大值爲1024M
這裏的ms是memory start的簡稱,mx是memory max的簡稱,分別表明最小堆容量和最大堆容量。可是別看這裏是-X參數,其實這是-XX參數,等價於:
-XX:InitialHeapSize
-XX:MaxHeapSize
在一般狀況下,服務器項目在運行過程當中,堆空間會不斷的收縮與擴張,勢必會形成沒必要要的系統壓力。因此在生產環境中,JVM的Xms和Xmx要設置成同樣的,可以避免GC在調整堆大小帶來的沒必要要的壓力。
三、Dump異常快照以及以文件形式導出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
堆內存出現OOM的機率是全部內存耗盡異常中最高的,出錯時的堆內信息對解決問題很是有幫助,因此給JVM設置這個參數(-XX:+HeapDumpOnOutOfMemoryError),讓JVM遇到OOM異常時能輸出堆內信息,並經過(-XX:+HeapDumpPath)參數設置堆內存溢出快照輸出的文件地址,這對於特別是對相隔數月纔出現的OOM異常尤其重要。
這兩個參數一般配套使用:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
四、發送OOM後,執行一個腳本
-XX:OnOutOfMemoryError
好比這樣設置:
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe"
表示發生OOM後,運行jconsole.exe程序。這裏能夠不用加「」,由於jconsole.exe路徑Program Files含有空格。
利用這個參數,咱們能夠在系統OOM後,自定義一個腳本,能夠用來發送郵件告警信息,能夠用來重啓系統等等。
五、打印gc信息
①、打印GC簡單信息
-verbose:gc
-XX:+PrintGC
一個是標準參數,一個是-XX參數,都是打印詳細的gc信息。一般會打印以下信息:
好比第一行,表示GC回收以前有12195K的內存,回收以後剩餘1088K,總共內存爲125951K
②、打印詳細GC信息
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
六、指定GC日誌以文件輸出
-Xloggc:./gc.log
這個在參數用於將gc日誌以文件的形式輸出,更方便咱們去查看日誌,定位問題。
七、設置永久代大小
-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
八、垃圾收集器經常使用參數
參考文檔:https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html