1. 程式人生 > >G1相關引數

G1相關引數

• -XX:+UseG1GC 啟用G1垃圾收集器

• -XX:G1HeapRegionSize=n 區域的大小。值是2的冪,範圍是1 MB到32 MB之間。目標是根據最小的Java 堆大小劃分出約 2048 個區域。這個值的預設值是根據堆的大小決定的。

• -XX:MaxGCPauseMillis=200 最長暫停時間設定目標值。預設值是200 毫秒。

• -XX:InitiatingHeapOccupancyPercent=45 觸發標記週期的Java堆佔用率閾值。預設佔用率是整個Java堆的 45%。

• -XX:G1ReservePercent=10 作為空閒空間的預留記憶體百分比,以降低目標空間溢位的風險。預設值是10%。 保留的空間用於年代之間的提升,注意這個空間保留後就不會用在年輕代。

• -XX:G1HeapWastePercent=5 可容忍的浪費堆空間百分比。如果可回收百分比小於該設定的百分比,JVM不會啟動混合垃圾回收週期。

• -XX:G1MixedGCCountTarget=8 標記週期完成後,對要執行垃圾回收的候選old區域收集完畢需要執行Mixed GC的目標次數。預設值是8。MixedGC的目標是要控制在此目標次數以內完成對上次標記週期標記出的候選old region的回收。該值設定過小,會導致每次Mixed GC疏散的old region數量過多,導致停頓時間變長。該值可以限制每次Mixed GC最少要回收的old region數量。

• -XX:G1OldCSetRegionThresholdPercent=10 混合垃圾收集期間,每次能進入CSet的old region的最大閾值(進入CSet表示要垃圾收集)。預設值是Java堆的 10%。如果該值設定過大,則每次Mixed GC需要疏散的old region數量會變多,導致停頓時間拉長。該值可以限制每次Mixed GC最多能回收的old region數量。

• -XX:ParallelGCThreads=n STW時並行工作的執行緒數。一般可以將 n 的值設定為邏輯處理器數的 5/8 左右。

• -XX:ConcGCThreads=n 並行標記的執行緒數。可以將 n 設定為並行垃圾回收執行緒數 (ParallelGCThreads) 的 1/4 左右。

-XX:+ParallelRefProcEnabled 並行處理Ref Proc階段,預設HotSpot使用單執行緒處理引用物件。

• -XX:+UnlockExperimentalVMOptions 要更改實驗性標誌的值,必須先對其解鎖。顯式地設定該引數。

• -XX:G1NewSizePercent=5 設定年輕代大小最小值的堆百分比。預設值是Java 堆的5%。這是一個實驗性的標誌。

• -XX:G1MaxNewSizePercent=60 設定要用作年輕代大小最大值的堆大小百分比。預設值是Java堆的 60%。這是一個實驗性的標誌。

-XX:+G1PrintRegionLivenessInfo 列印堆記憶體裡每個Region的存活物件資訊。這個資訊在標記結束後打印出來。這是一個實驗性的標誌。

-XX:+G1TraceConcRefinement 如果啟用,並行回收階段的日誌就會被詳細打印出來;這是一個實驗性的標誌。

-XX:+G1TraceEagerReclaimHumongousObject 如果啟用,會列印大物件的回收日誌;這是一個實驗性的標誌。

-XX:+UseStringDeduplication 開啟Java String物件的分割工作,這個是JDK8u20之後新增的引數,主要用於相同String避免重複申請記憶體,節約Region的使用。

• -XX:G1MixedGCLiveThresholdPercent=85 在併發標記階段怎麼識別old region需要被回收而標記成candidate old region,以便在Mixed GC階段進入CSet而被回收呢?是通過G1MixedGCLiveThresholdPercent來控制的,當region中的存活資料佔比率不超過該閾值時,則表示要被回收,預設佔用率為85%。 在併發標記階段每個region中的存活資料佔比率會被重新計算,那些存活資料佔比較多的region,疏散時的代價相對較昂貴,它們還會被標記為expensive region。如果在MixedGC階段這種region大量進入CSet中可能會導致MixedGC的停頓時間過長。G1為了區分開這些region而做了分開標記,在MixedGC階段優先回收candidate old region,如果代價許可,會嘗試回收expensive region。