- 調優目標
- GC時間足夠小
- GC次數足夠少
- Full GC週期足夠長
- Full GC次數少
- 移轉到老年代的對象少
- 調優結果
- 代碼減少使用全局變量和大對象
- 調整新生代大小
- 調整老年大大小
- 選擇合適的GC收集器
- 調優步驟
- 監控GC狀態
- 生成Dump文件
- 分析Dump文件
- 調整參數
- 監控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
- 調整參數
- 其他參數
- 減少GC次數
- -Xmx = -Xms
- -XX:newSize = -XX:MaxNewSize
- 提高閥值 -XX:MaxTenuringThreshold
- 調整Old區
- 觀察Old區之峰值 , 適當調高Young區 , 但會增加mior gc時間 , 關鍵字NewRatio
- 硬體較好的設備可在Old區使用並行收集算法
# -XX:+UseParallelOldPC
- 調整Stack
- 每個線呈默認開啟 1M stack , 內存不變下可增加線呈數
- 重複演練
- 其他
- 吞吐量優先的並行收集器與響應時間優先的併發收集器選擇
- 參考網址
- 何謂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種垃圾回收方式
- 參考網址
- ClassLoader構造
- 沙箱安全機制
- 類別保護機制 , 呼叫類別優先從上層級別開始 , 因此開發人員無法複寫例如 java.lang.String類別
- Stack構造
- java.lang.StackOverFlowError
- Heap構造
- OOM : Heap
- 當內存不足時 , JVM連續發生GC時
- 每次回收小於2%