JVM(五):JVM模型與GC
- 確定垃圾
- 引用計數(存在循環引用問題)
- 根可達演算法
- 常見的垃圾回收演算法
- 標記清除演算法-位置不連續,產生碎片
- 拷貝演算法- 沒有碎片,浪費空間
- 標記壓縮-沒有碎片,效率偏低(多執行緒需要進行執行緒同步,單執行緒效率本來就低)
- JVM記憶體分代模型(用於分代垃圾回收演算法)
- 部分垃圾回收器使用的模型
- 新生代+老年代+永久代(1.7)/元數據區(1.8)Metaspace
- 永久代 元數據- Class
- 永久代必須指定大小限制,元數據區可以設置,也可以不設置,無上限(受限與物理記憶體)
- 字元串常量 1.7在永久代,1.8在堆
- MethodArea(方法區)邏輯概念-指的是永久代或元數據
c. 新生代 = Eden + 2個suvivor區
- YGC回收之後,大多數對象會被回收,活著的進入s0
- 再次YGC,活著的對象eden + s0 ->s1
- 再次YGC,eden+s1->s0
- 年齡足夠->老年代
- s區裝不下->老年代
d. 老年代
- 頑固分子
- 老年代滿了FGC
e. GC Tuning(Generation)
- 盡量減少FGC
- MinorGC = YGC
- MajorGC = FGC
- 常見的垃圾回收器
- Serial-年輕代 串列回收
b. PS-年輕代 並行回收
c. ParNew-年輕代 配合CMS的並行回收(PS和CMS不能配合使用,為了配合CMS,產生了ParNew)
d. SerialOld
e. ParallelOld
f. ConcurrentMarkSweep 老年代,垃圾回收和引用程式同時進行,降低STW的時間(200ms)
j. G1(10ms)
h. ZGC(1ms) PK C++
i. Shenandoah
g. Eplison
1.8默認的垃圾回收器: PS+ParallelOld
- JVM調優
- JVM命令行參數參考: 命令行
- 常用:
- -XX:+PrintFlagsFinal (列印所有最終生效值)
- -XX:+PrintFlagsInitial (列印默認值)
- -XX:+PrintCommandLineFlags (啟動時的命令行參數)
- JVM參數分類
- 標準:-開頭,所有的HotSpot都支援
- 非標準: -X開頭,特定版本HotSpot支援特定命令
- 不穩定: -XX開頭,下個版本可能取消