2020/2/17

GC優化步驟


  • 調優目標
    • GC時間足夠小
    • GC次數足夠少
    • Full GC週期足夠長
    • Full GC次數少
    • 移轉到老年代的對象少
  • 調優結果
    • 代碼減少使用全局變量和大對象
    • 調整新生代大小
    • 調整老年大大小
    • 選擇合適的GC收集器
  • 調優步驟
    1. 監控GC狀態
    2. 生成Dump文件
    3. 分析Dump文件
    4. 調整參數
  • 監控GC狀態
    • 開啟GC日誌(3選1)
      # -XX:+PrintGCDetails 
      # -XX:+PrintGCTimeStamps
      # -XX:+PrintGCDateStamps
    • 存放GC日誌檔
      # -Xloggc:/gc.log
    • 需注意之狀態
      • Minor時間超過50ms
      • Minor時間10秒內一次
      • Full GC時間超過1秒
      • Full GC時間10分鐘內一次
      • Full GC無效果
  • 生成Dump文件
    • 開啟OOM Dump文件
      # -XX:+HeapDumpOnOutOfMemoryError
    • 存放Dump文件 *.hprof
      # -XX:HeapDumpPath=D:\
  • 分析Dump文件 *.hprof
    • 中文開啟 .....jdk/bin/jvisualvm.exe
      # jvisualvm --locale zh:CN
    • D:\>Java\jdk1.8.0_241\bin\jvisualvm.exe  --locale zh:CN
    • 開啟dump文件 *.hprof

  • 調整參數
    • 其他參數
    • 減少GC次數
      • -Xmx = -Xms
      • -XX:newSize =  -XX:MaxNewSize
      • 提高閥值 -XX:MaxTenuringThreshold
        • 預設minor gc 達15次放入old區
    • 調整Old區
      • 觀察Old區之峰值 , 適當調高Young區 , 但會增加mior gc時間 , 關鍵字NewRatio
      • 硬體較好的設備可在Old區使用並行收集算法
        # -XX:+UseParallelOldPC 
    • 調整Stack
      • 每個線呈默認開啟 1M stack , 內存不變下可增加線呈數
    • 重複演練
  • 其他
    • 吞吐量優先的並行收集器與響應時間優先的併發收集器選擇

2020/2/16

JVM構造(下)


  • 參考網址
  • 何謂GC回收?
    • 分代收集算法
      • 根據各區特性使用不同算法
    • 特性
      • GC次數較頻繁收集於Heap Young區
      • GC次數較少收集於Heap Old區
      • 基本上不動的收集於Perm區
  • Heap Young
    • 複製算法( Copying )
      • 當Eden內存滿時 , Minor GC清空Eden區 , 將 From區與Eden區存放於To區
      • From區與To區的內存不斷進行複製、移動、整理
      • 優點 : 內存碎片減少、效率高
      • 缺點 : 需要2倍內存空間、
  • Heap Old
    • 標記清除( Mark-Swap )
      • 第一次掃描進行標記
      • 第二次掃描進行清除
      • 優點 : 不浪費內存空間(不用2倍內存)
      • 缺點 : 掃描兩次、產生內存碎片
    • 標記壓縮( Mark-Compact )
      • 第一次掃描標記
      • 第二次掃描移動(壓縮)
      • 優點 : 無內存碎片
      • 缺點 : 掃描兩次
    • 標記清除壓縮( Mark-Swap-Compact )
      •  Mark-Swap + Mark-Compact
      • 多次 Mark-Swap GC之後才做Mark-Compact
      • 優點 : 減少移動成本
  • 3種垃圾回收方式
    • 串行 serial 
      • 單線呈進行垃圾回收
    • 並行 
      • 多線呈進行垃圾回收, 回收期間暫停程序
    • 並發
      • 多線呈進行垃圾回收, 回收期間暫停程序

JVM構造(中)


  • 參考網址
  • ClassLoader構造
    • 沙箱安全機制
      • 類別保護機制 , 呼叫類別優先從上層級別開始 , 因此開發人員無法複寫例如 java.lang.String類別
  • Stack構造
    • java.lang.StackOverFlowError
      • 原因為棧空間滿

  • Heap構造
    • OOM : Heap 
      • 當內存不足時 , JVM連續發生GC時
      • 每次回收小於2%
  • 永久區構造

test2