(轉)JVM引數的說明、簡單記法和GC調優策略
背景:在進行jvm調優的時候引數總是記不住,也不知道為啥要調優
https://blog.csdn.net/u013066244/article/details/88089766
環境
java7+
前言
看了大部分博文對JVM
所謂調優就是修改引數值,但是我覺得這不算調優,比如:將最大記憶體值調大了,這就叫調優嗎?
每次別人問我伺服器怎麼調優,我都會理解成,怎麼修改原始碼或者用某種演算法去提升效能,而不是改什麼引數;
好了,上面就是吐槽了,JVM
調優應該是個很高大上的東西,但是看別人部落格就是調引數,不能苟同;
說起引數,JVM
的引數,對我這記性不好的人來說,還是蠻難記的;
看到知乎的上的評論,過來做個筆記
引數
JVM引數 | 說明 |
---|---|
- Xmx | 設定堆的最大記憶體值,等同於-XX:MaxHeapSize |
-Xms | 設定JVM 啟動時,堆的初始化大小 |
-Xmn | 設定堆中新生代初始化及最大大小 |
-Xss | 設定執行緒大小,等同於-XX:ThreadStackSize |
-XX:PermGen | 設定永久代記憶體的初始化大小(Java8 中開始廢棄永久代) |
-XX:MaxPermGen | 設定永久代的最大值 |
-XX:SurvivorRatio | 設定Eden區和Survivor區的空間比例:Eden/S0 = Eden/S1 預設為8 |
-XX:NewRatio | 設定年老代和年輕代的比例大小,預設值為2 |
-Xms 如果要進一步細化:初始化大小用
-XX:NewSize
,最大大小用-XX:MaxNewSize
簡單記法
引數 | 記法 |
---|---|
-Xmx | Memory Maxumaximum 理解為max的縮寫mx |
-Xms | Memory Start-up |
-Xmn | Memory new |
-Xss | Stack size |
GC調優原則
1、多數的Java
應用不需要在伺服器上進行GC優化;
2、多數導致GC問題的情況,都不是因為設定引數錯誤造成的,而是程式碼問題;
JVM
引數設定到最合適(最優);4、減少使用全域性變數和大物件;如果迫不得已建立了很多大物件,在不使用時,應該手動賦予
null
(在公司有過實際經歷);5、GC優化是最後不得已才採用的手段
GC的目的
1、將轉移到老年代的物件數量降低到最小
2、減少GC的執行時間
策略1
將新物件預留在新生代,由於Full GC
的成本遠高於Minor GC
,因此儘量將物件分配在新生代是明智的做法,實際專案中根據GC日誌分析新生代空間是否分配合理,適當通過-Xmn
命令來調節新生代大小,最大限度降低新物件進入老年代的情況。
策略2
大物件進入老年代,雖然大部分情況下,將物件分配在新生代是合理。但是對於大物件這種做法卻是不太好的,大物件如果首次在新生代分配可能會出現空間不足導致很多年齡不夠的小物件被分配到老年代,破壞了新生代的結構,可能出現頻繁的Full GC
。因此,對於大物件,可以設定直接進入老年代;-XX:PretenureSizeThreshold
可以設定直接進入老年代的物件大小。
策略3
合理設定進入老年代物件的年齡,-XX:MaxTenuringThreshold
設定物件進入老年代的年齡大小,減少老年代的記憶體佔用,降低發生Full GC
的頻率。
策略4
設定合理的堆大小,堆大小設定有兩個引數:-Xms 初始化堆大小
,Xmx
最大堆大小。
不需要GC優化的情況
1、MinorGC 執行時間不到50ms
2、MinorGC 執行不頻繁,約10秒一次
3、Full GC 執行時間不到1s
4、Full GC 執行頻率不算頻繁,不低於(大約)10分鐘一次
參考地址:JVM 配置常用引數和常用 GC 調優策略
JVM的GC 引數為什麼要這麼命名:xms、xss、xmn和xmn?