重要的JVM參數,通用及G1


  1. -XX:+DisableExplicitGC 禁止使用System.gc(),雖說一般的程序猿也不會這么用,還是加上保險
  2. 千萬不要設置年輕代大小,G1會動態調節。
  3. -verbose:gc -Xloggc:target/gc.log 一定要設置好gc日志,方便定位
  4. -XX:MaxGCPauseMillis 默認是250ms。如果希望cpu多用於業務計算少用於gc線程,可以調大這個值。
  5. 如果G1發生full gc較多,需要分析原因。如果日志中這一行 "Humongous regions: X->Y” 中的Y就是大對象占用的region數量。可以使用 -XX:G1HeapRegionSize 調大region的大小來減少大對象占用的region數。
  6. 增加並發標記的線程數,通過 -XX:ConcGCThreads這個參數。可以讓垃圾回收更快一點,以減少有些垃圾來不及回收。但是會影響cpu的使用
  7. -XX:G1ReservePercent G1會保留一部分堆內存用來防止分配不了的情況,默認是10
  8.  -XX:InitiatingHeapOccupancyPercent  全部使用的region占到總堆空間多少開始gc,默認值45%。調小可以早點開始gc周期
  9. -XX:G1MixedGCLiveThresholdPercent=65

    為混合垃圾回收周期中要包括的舊區域設置占用率閾值。默認占用率為 65%。這是一個實驗性的標志。有關示例,請參見“如何解鎖實驗性虛擬機標志”。此設置取代了 -XX:G1OldCSetRegionLiveThresholdPercent 設置。Java HotSpot VM build 23 中沒有此設置。

  10. -XX:G1MixedGCCountTarget=8 調大該值可以減少每次停頓的時間

    設置標記周期完成后,對存活數據上限為 G1MixedGCLIveThresholdPercent 的舊區域執行混合垃圾回收的目標次數。默認值是 8 次混合垃圾回收。混合回收的目標是要控制在此目標次數以內。Java HotSpot VM build 23 中沒有此設置。

  11. -XX:+G1EagerReclaimHumongousObjects  在YGC的時候,G1也能回收那些沒有任何引用指向的超大對象

參考的文章

https://www.oracle.com/cn/technical-resources/articles/java/g1gc.html

 

轉載自 https://blog.csdn.net/renfufei/article/details/41897113

什么是轉移失敗(Evacuation Failure)?

對 survivors 或 promoted objects 進行GC時如果JVM的heap區不足就會發生提升失敗(promotion failure). 堆內存不能繼續擴充,因為已經達到最大值了. 當使用 -XX:+PrintGCDetails 時將會在GC日志中顯示 to-space overflow (to-空間溢出)。

這是很昂貴的操作!

  • GC仍繼續所以空間必須被釋放.
  • 拷貝失敗的對象必須被放到正確的位置(tenured in place).
  • CSet指向區域中的任何 RSets 更新都必須重新生成(regenerated).
  • 所有這些步驟都是代價高昂的.

如何避免轉移失敗(Evacuation Failure)

要避免避免轉移失敗, 考慮采納下列選項.

  • 增加堆內存大小
    • 增加 -XX:G1ReservePercent=n, 其默認值是 10.
    • G1創建了一個假天花板(false ceiling),在需要更大 'to-space' 的情況下會嘗試從保留內存獲取(leave the reserve memory free).
  • 更早啟動標記周期(marking cycle)
  • 通過采用 -XX:ConcGCThreads=n 選項增加標記線程(marking threads)的數量.
選項/默認值 說明
-XX:+UseG1GC 使用 G1 (Garbage First) 垃圾收集器
-XX:MaxGCPauseMillis=n 設置最大GC停頓時間(GC pause time)指標(target). 這是一個軟性指標(soft goal), JVM 會盡量去達成這個目標.
-XX:InitiatingHeapOccupancyPercent=n 啟動並發GC周期時的堆內存占用百分比. G1之類的垃圾收集器用它來觸發並發GC周期,基於整個堆的使用率,而不只是某一代內存的使用比. 值為 0 則表示"一直執行GC循環". 默認值為 45.
-XX:NewRatio=n 新生代與老生代(new/old generation)的大小比例(Ratio). 默認值為 2.
-XX:SurvivorRatio=n eden/survivor 空間大小的比例(Ratio). 默認值為 8.
-XX:MaxTenuringThreshold=n 提升年老代的最大臨界值(tenuring threshold). 默認值為 15.
-XX:ParallelGCThreads=n 設置垃圾收集器在並行階段使用的線程數,默認值隨JVM運行的平台不同而不同.
-XX:ConcGCThreads=n 並發垃圾收集器使用的線程數量. 默認值隨JVM運行的平台不同而不同.
-XX:G1ReservePercent=n 設置堆內存保留為假天花板的總量,以降低提升失敗的可能性. 默認值是 10.
-XX:G1HeapRegionSize=n 使用G1時Java堆會被分為大小統一的的區(region)。此參數可以指定每個heap區的大小. 默認值將根據 heap size 算出最優解. 最小值為 1Mb, 最大值為 32Mb.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM