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開頭,下個版本可能取消