文章目錄
- 1.概述
- 2.堆內存相關
- 2.1.顯式指定堆內存`–Xms`和`-Xmx`
- 2.2.顯式新生代內存(Young Ceneration)
- 2.3.顯示指定永久代/元空間的大小
- 3.垃圾收集相關
- 3.1.垃圾回收器
- 3.2.GC記錄
1.概述
在本篇文章中,你將掌握最常用的 JVM 參數配置。如果對于下面提到了一些概念比如堆、
2.堆內存相關
Java 虛擬機所管理的內存中最大的一塊,Java 堆是所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例以及數組都在這里分配內存。
2.1.顯式指定堆內存–Xms
和-Xmx
與性能有關的最常見實踐之一是根據應用程序要求初始化堆內存。如果我們需要指定最小和最大堆大小(推薦顯示指定大小),以下參數可以幫助你實現:
-Xms<heap size>[unit]
-Xmx<heap size>[unit]
- heap size 表示要初始化內存的具體大小。
- unit 表示要初始化內存的單位。單位為***“ g”*** (GB) 、“ m”(MB)、“ k”(KB)。
舉個栗子🌰,如果我們要為JVM分配最小2 GB和最大5 GB的堆內存大小,我們的參數應該這樣來寫:
-Xms2G -Xmx5G
2.2.顯式新生代內存(Young Ceneration)
根據Oracle官方文檔,在堆總可用內存配置完成之后,第二大影響因素是為 Young Generation
在堆內存所占的比例。默認情況下,YG 的最小大小為 1310 MB,最大大小為無限制。
一共有兩種指定 新生代內存(Young Ceneration)大小的方法:
1.通過-XX:NewSize
和-XX:MaxNewSize
指定
-XX:NewSize=<young size>[unit]
-XX:MaxNewSize=<young size>[unit]
舉個栗子🌰,如果我們要為 新生代分配 最小256m 的內存,最大 1024m的內存我們的參數應該這樣來寫:
-XX:NewSize=256m
-XX:MaxNewSize=1024m
2.通過-Xmn<young size>[unit]
指定
舉個栗子🌰,如果我們要為 新生代分配256m的內存(NewSize與MaxNewSize設為一致),我們的參數應該這樣來寫:
-Xmn256m
GC 調優策略中很重要的一條經驗總結是這樣說的:
將新對象預留在新生代,由于 Full GC 的成本遠高于 Minor GC,因此盡可能將對象分配在新生代是明智的做法,實際項目中根據 GC 日志分析新生代空間大小分配是否合理,適當通過“-Xmn”命令調節新生代大小,最大限度降低新對象直接進入老年代的情況。
另外,你還可以通過**-XX:NewRatio=<int>
**來設置新生代和老年代內存的比值。
比如下面的參數就是設置新生代(包括Eden和兩個Survivor區)與老年代的比值為1。也就是說:新生代與老年代所占比值為1:1,新生代占整個堆棧的 1/2。
-XX:NewRatio=1
2.3.顯示指定永久代/元空間的大小
從Java 8開始,如果我們沒有指定 Metaspace 的大小,隨著更多類的創建,虛擬機會耗盡所有可用的系統內存(永久代并不會出現這種情況)。
JDK 1.8 之前永久代還沒被徹底移除的時候通常通過下面這些參數來調節方法區大小
-XX:PermSize=N //方法區 (永久代) 初始大小
-XX:MaxPermSize=N //方法區 (永久代) 最大大小,超過這個值將會拋出 OutOfMemoryError 異常:java.lang.OutOfMemoryError: PermGen
相對而言,垃圾收集行為在這個區域是比較少出現的,但并非數據進入方法區后就“永久存在”了。
JDK 1.8 的時候,方法區(HotSpot 的永久代)被徹底移除了(JDK1.7 就已經開始了),取而代之是元空間,元空間使用的是直接內存。
下面是一些常用參數:
-XX:MetaspaceSize=N //設置 Metaspace 的初始(和最小大小)
-XX:MaxMetaspaceSize=N //設置 Metaspace 的最大大小,如果不指定大小的話,隨著更多類的創建,虛擬機會耗盡所有可用的系統內存。
3.垃圾收集相關
3.1.垃圾回收器
為了提高應用程序的穩定性,選擇正確的垃圾收集算法至關重要。
JVM具有四種類型的GC實現:
- 串行垃圾收集器
- 并行垃圾收集器
- CMS垃圾收集器
- G1垃圾收集器
可以使用以下參數聲明這些實現:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC
有關垃圾回收實施的更多詳細信息,請參見此處。
3.2.GC記錄
為了嚴格監控應用程序的運行狀況,我們應該始終檢查JVM的垃圾回收性能。最簡單的方法是以人類可讀的格式記錄GC活動。
使用以下參數,我們可以記錄GC活動:
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log