本篇文章我們就來給大家介紹垃圾收集器的 JVM 參數(shù)配置。
JVM參數(shù)有很多,其實我們直接使用默認的JVM參數(shù),不去修改都可以滿足大多數(shù)情況。但是如果你想在有限的硬件資源下,部署的系統(tǒng)達到最大的運行效率,那么進行相關(guān)的JVM參數(shù)設(shè)置是必不可少的。下面我們就來對這些JVM參數(shù)進行詳細的介紹。JVM參數(shù)主要分為以下三種(可以根據(jù)書寫形式來區(qū)分):
1、標準參數(shù)
標準參數(shù),顧名思義,標準參數(shù)中包括功能以及輸出的結(jié)果都是很穩(wěn)定的,基本上不會隨著JVM版本的變化而變化。
我們可以通過 -help 命令來檢索出所有標準參數(shù)。
關(guān)于這些命令的詳細解釋,可以參考官網(wǎng):https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html
-help 也是一個標準參數(shù),再比如使用比較多的 -version也是。
①、-version
顯示Java的版本信息。
2、X 參數(shù)
對應(yīng)前面講的標準化參數(shù),這是非標準化參數(shù)。表示在將來的JVM版本中可能會發(fā)生改變,但是這類以 -X開始的參數(shù)變化的比較小。
我們可以通過 Java -X 命令來檢索所有-X 參數(shù)。
關(guān)于這些參數(shù)的介紹,其實上圖的中文解釋很清楚了,這里我們不作過多的介紹。
3、XX參數(shù)
這是我們?nèi)粘i_發(fā)中接觸到最多的參數(shù)類型。這也是非標準化參數(shù),相對來說不穩(wěn)定,隨著JVM版本的變化可能會發(fā)生變化,主要用于JVM調(diào)優(yōu)和debug。
注意:這種參數(shù)是我們后續(xù)介紹JVM調(diào)優(yōu)講解最多的參數(shù)。
該參數(shù)的書寫形式又分為兩大類:
①、Boolean類型 格式:-XX:[+-]表示啟用或者禁用name屬性。
例子:-XX:+UseG1GC(表示啟用G1垃圾收集器)
②、Key-Value類型 格式:-XX:=表示name的屬性值為value。
例子:-XX:MaxGCPauseMillis=500(表示設(shè)置GC的最大停頓時間是500ms)
4、參數(shù)詳解
1、打印已經(jīng)被用戶或者當前虛擬機設(shè)置過的參數(shù)
-XX:+PrintCommandLineFlags
比如:
2、最大堆和最小堆內(nèi)存設(shè)置
-Xms512M:設(shè)置堆內(nèi)存初始值為512M
-Xmx1024M:設(shè)置堆內(nèi)存最大值為1024M
這里的ms是memory start的簡稱,mx是memory max的簡稱,分別代表最小堆容量和最大堆容量。但是別看這里是-X參數(shù),其實這是-XX參數(shù),等價于:
-XX:InitialHeapSize
-XX:MaxHeapSize
在通常情況下,服務(wù)器項目在運行過程中,堆空間會不斷的收縮與擴張,勢必會造成不必要的系統(tǒng)壓力。所以在生產(chǎn)環(huán)境中,JVM的Xms和Xmx要設(shè)置成一樣的,能夠避免GC在調(diào)整堆大小帶來的不必要的壓力。
3、Dump異常快照以及以文件形式導(dǎo)出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
堆內(nèi)存出現(xiàn)OOM的概率是所有內(nèi)存耗盡異常中最高的,出錯時的堆內(nèi)信息對解決問題非常有幫助,所以給JVM設(shè)置這個參數(shù)(-XX:+HeapDumpOnOutOfMemoryError),讓JVM遇到OOM異常時能輸出堆內(nèi)信息,并通過(-XX:+HeapDumpPath)參數(shù)設(shè)置堆內(nèi)存溢出快照輸出的文件地址,這對于特別是對相隔數(shù)月才出現(xiàn)的OOM異常尤為重要。
這兩個參數(shù)通常配套使用:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
4、發(fā)送OOM后,執(zhí)行一個腳本
-XX:OnOutOfMemoryError
比如這樣設(shè)置:
-XX:OnOutOfMemoryError="C:Program FilesJavajdk1.8.0_152binjconsole.exe"
表示發(fā)生OOM后,運行jconsole.exe程序。這里可以不用加“”,因為jconsole.exe路徑Program Files含有空格。
利用這個參數(shù),我們可以在系統(tǒng)OOM后,自定義一個腳本,可以用來發(fā)送郵件告警信息,可以用來重啟系統(tǒng)等等。
5、打印gc信息
①、打印GC簡單信息
-verbose:gc
-XX:+PrintGC
一個是標準參數(shù),一個是-XX參數(shù),都是打印詳細的gc信息。通常會打印如下信息:
比如第一行,表示GC回收之前有12195K的內(nèi)存,回收之后剩余1088K,總共內(nèi)存為125951K
②、打印詳細GC信息
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
6、指定GC日志以文件輸出
-Xloggc:./gc.log
這個在參數(shù)用于將gc日志以文件的形式輸出,更方便我們?nèi)ゲ榭慈罩荆ㄎ粏栴}。
7、設(shè)置永久代大小
-XX:MaxPermSize=1280m
在JDK1.7以及以前的版本中,只有Hotspot 才有Perm區(qū),稱為永久代,它在啟動時固定大小,很難進行調(diào)優(yōu)。
在某些情況下,如果動態(tài)加載類過多,容易產(chǎn)生Perm區(qū)的 OOM。比如某個實際 Web 工程中,因為功能點較多,在運行過程中,要不斷動態(tài)加載很多類,就會出現(xiàn)類似錯誤:
"Exception in thread 'dubbo client x.x.connect' java.lang.OutOfMemoryError:PermGenspace"
為了解決這個問題,就需要在項目啟動時,設(shè)定運行參數(shù)-XX:MaxPermSize。
注意:在JDK1.8以后面的版本,使用元空間來代替永久代。在 JDK1.8以及后面的版本中,如果設(shè)定參數(shù)-XX:MaxPermSize,啟動JVM不會報錯,但是會提示:
Java Hotspot 64Bit Server VM warning:ignoring option MaxPermSize=1280m:support was removed in 8.0
8、垃圾收集器常用參數(shù)
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3052瀏覽量
74214 -
參數(shù)
+關(guān)注
關(guān)注
11文章
1859瀏覽量
32378 -
JVM
+關(guān)注
關(guān)注
0文章
158瀏覽量
12252 -
收集器
+關(guān)注
關(guān)注
0文章
30瀏覽量
3169
發(fā)布評論請先 登錄
相關(guān)推薦
評論