1. 程式人生 > 實用技巧 >(轉)JVM引數的說明、簡單記法和GC調優策略

(轉)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問題的情況,都不是因為設定引數錯誤造成的,而是程式碼問題;

3、在應用上線之前,先考慮將機器的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?