1. 程式人生 > >JVM:GC-常用JVM引數

JVM:GC-常用JVM引數

JVM引數太多了,先記錄一些常用的加深印象。

常用引數

-Xms:初始堆記憶體
-Xmx:最大堆記憶體
-Xmn:新生代大小
-Xss:每個執行緒棧大小
-XX:MaxPermSize:永久代大小
-XX:NewRatio 預設為2 ,老年代為新生代的2倍
-XX:SurvivorRatio 預設為8 ,eden:survivor=8
-XX:PretenureSizeThreshold=3145728 超過閾值大小的新物件直接分配進入老年代
-XX:MaxTenuringThreshold 在survivor區存活到閾值年齡就會進入老年代
-XX:+HandlePromotionFailure 允許擔保失敗
-Dsun.reflect.inflationThreshold=2147483647 【在method反射呼叫方法時,每次都呼叫native方法。。】

輔助引數

-verbose:gc -XX:+PrintGCDetails:列印GC日誌
-XX:+PrintGCTimestamps:打印發生GC的相對時間
-XX:+PrintGCApplicationStopedTime:列印GC時應用暫停的時間。
-XX:+DisableExplicitGC :關閉呼叫System.gc所觸發的FULL GC.
-XX:+HeapDumpOnOutOfMemoryError:在OOM時生成堆疊資訊
-XX:HeapDumpPath=${目錄} :輸出堆疊資訊到指定目錄

垃圾回收器常用

吞吐量優先:
-XX:+UseParallelOldGC:年輕代和年老代都使用吞吐量優先收集器
+XX:GCTimeRatio:預設99,代表GC時間佔1%

CMS:
-XX:+UseConcMarkSweepGC:ParNew+CMS+Serial Old
SerialOld作為CMS發生Concurrent Mode Failrue(預留的記憶體不足以在GC期間留給浮動垃圾)
因為CMS是標記清除的,所以會存在浮動垃圾,因此不能再記憶體滿時才清理,需要設定一個閾值:
-XX:CMSInitiatingOccupancyFraction:在記憶體使用超過閾值回就回收
此時,由於是標記清除的,如果不進行記憶體的整合,很有可能出現即使記憶體足夠,也無法放進一個連續大物件的情況,所以需要FULL GC 後整合空間
-XX:UserCMSCompactAtFullCollection:即在FullGC後就執行一次整理,整理碎片的階段stop the world.
因此,最好不要每次都整理碎片。
所以設定一個閾值:
-XX:CMSFullGCBeforeCompaction:意思是在幾次不壓縮的GC後,來一次有壓縮空間的。