配置堆區:-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn;
-Xms :表示java虛擬機堆區內存初始內存分配的大小,通常為操作系統可用內存的1/64大小即可,但仍需按照實際情況進行分配。
-Xmx: 表示java虛擬機堆區內存可被分配的最大上限,通常為操作系統可用內存的1/4大小。但是開發過程中,通常會將 -Xms 與 -Xmx兩個參數的配置相同的值,其目的是為了能夠在java垃圾回收機制清理完堆區後不需要重新分隔計算堆區的大小而浪費資源。(PS:當初始堆佔滿後,會嘗試進行GC,如果GC之後還不能得到足夠的內存,那麼就會擴展堆,如果-Xmx設置的太小,擴展堆就會失敗,導致OutOfMemoryError錯誤提示)
一般來講對於堆區的內存分配只需要對上述兩個參數進行合理配置即可,但是如果想要進行更加精細的分配還可以對堆區內存進一步的細化,那就要用到下面的三個參數了-XX:newSize、-XX:MaxnewSize、-Xmn。當然這源於對堆區的進一步細化分:新生代、中生代、老生代。java中每新new一個對象所佔用的內存空間就是新生代的空間,當java垃圾回收機制對堆區進行資源回收後,那些新生代中沒有被回收的資源將被轉移到中生代,中生代的被轉移到老生代。而接下來要講述的三個參數是用來控制新生代內存大小的。
-XX:newSize:表示新生代初始內存的大小,應該小於 -Xms的值;
-XX:MaxnewSize:表示新生代可被分配的內存的最大上限;當然這個值應該小於 -Xmx的值;
-Xmn:至於這個參數則是對 -XX:newSize、-XX:MaxnewSize兩個參數的同時配置,也就是說如果通過-Xmn來配置新生代的內存大小,那麼-XX:newSize
= -XX:MaxnewSize = -Xmn,雖然會很方便,但需要注意的是這個參數是在JDK1.4版本以後才使用的。
配置非堆區:-XX:PermSize、-XX:MaxPermSize
-XX:PermSize:表示非堆區初始內存分配大小,其縮寫為permanent size(持久化內存)
-XX:MaxPermSize:表示對非堆區分配的內存的最大上限。 這裡面非常要注意的一點是:在配置之前一定要慎重的考慮一下自身軟件所需要的非堆區內存大小,因為此處內存是不會被java垃圾回收機制進行處理的地方。並且更加要注意的是最大堆內存與最大非堆內存的和絕對不能夠超出操作系統的可用內存。
如DDW項目啟動Tomcat內存參數: JAVA_OPTS="-server -Xms4096m -Xmx5096m
-XX:MaxNewSize=128m -XX:PermSize=256M -XX:MaxPermSize=512m -Djava.awt.headless=true -Dfile.encoding=UTF-8"
獲取垃圾回收器信息:
-XX:+PrintCommandLineFlagsjvm參數可查看默認設置收集器類型
-XX:+PrintGCDetails亦可通過打印的GC日誌的新生代、老年代名稱判斷
java命令中的參數配置:
-Xmixed 混合模式執行 (默認)
-Xint 僅解釋模式執行
-Xbootclasspath:
設置搜索路徑以引導類和資源
-Xbootclasspath/a:
附加在引導類路徑末尾
-Xbootclasspath/p:
置於引導類路徑之前
-Xdiag 顯示附加診斷消息
-Xnoclassgc 禁用類垃圾收集
-Xincgc 啟用增量垃圾收集
-Xloggc:<file> 將 GC 狀態記錄在文件中 (帶時間戳)/<file>
-Xbatch 禁用後臺編譯
-Xms<size> 設置初始 Java 堆大小/<size>
-Xmx<size> 設置最大 Java 堆大小/<size>
-Xss<size> 設置 Java 線程堆棧大小/<size>
-Xprof 輸出 cpu 配置文件數據
-Xfuture 啟用最嚴格的檢查, 預期將來的默認值
-Xrs 減少 Java/VM 對操作系統信號的使用 (請參閱文檔)
-Xcheck:jni 對 JNI 函數執行其他檢查
-Xshare:off 不嘗試使用共享類數據
-Xshare:auto 在可能的情況下使用共享類數據 (默認)
-Xshare:on 要求使用共享類數據, 否則將失敗。
-XshowSettings 顯示所有設置並繼續
-XshowSettings:all
顯示所有設置並繼續
-XshowSettings:vm 顯示所有與 vm 相關的設置並繼續
-XshowSettings:properties
顯示所有屬性設置並繼續
-XshowSettings:locale
顯示所有與區域設置相關的設置並繼續
XX參數
這是我們日常開發中接觸到最多的參數類型。這也是非標準化參數,相對來說不穩定,隨著JVM版本的變化可能會發生變化,主要用於JVM調優和debug。
注意:這種參數是我們後續介紹JVM調優講解最多的參數。
該參數的書寫形式又分為兩大類:
①、Boolean類型
格式:-XX:[±] 表示啟用或者禁用name屬性。
例子:-XX:+UseG1GC(表示啟用G1垃圾收集器)
②、Key-Value類型
格式:-XX:= 表示name的屬性值為value。
例子:-XX:MaxGCPauseMillis=500(表示設置GC的最大停頓時間是500ms)
參數詳解(持續更新)
本節我們會持續更新羅列一些JVM參數。
1、打印已經被用戶或者當前虛擬機設置過的參數
-XX:+PrintCommandLineFlags
比如:
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信息。通常會打印如下信息:
比如第一行,表示GC回收之前有12195K的內存,回收之後剩餘1088K,總共內存為125951K
②、打印詳細GC信息
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
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、垃圾收集器常用參數
————————————————
原文鏈接:https://blog.csdn.net/u013257767/article/details/105569044
閱讀更多 夜裡慢慢行 的文章