JVM(五):JVM模型與GC

  1. 確定垃圾
    • 引用計數(存在循環引用問題)
    • 根可達算法

截屏2020-10-14 上午10.42.19.png

  1. 常見的垃圾回收算法
    • 標記清除算法-位置不連續,產生碎片

截屏2020-10-14 上午10.51.20.png

    • 拷貝算法- 沒有碎片,浪費空間

截屏2020-10-14 上午10.53.46.png

    • 標記壓縮-沒有碎片,效率偏低(多線程需要進行線程同步,單線程效率本來就低)

截屏2020-10-14 上午10.59.10.png

 

  1. JVM內存分代模型(用於分代垃圾回收算法)
    1. 部分垃圾回收器使用的模型
    2. 新生代+老年代+永久代(1.7)/元數據區(1.8)Metaspace
      1. 永久代 元數據- Class
      2. 永久代必須指定大小限制,元數據區可以設置,也可以不設置,無上限(受限與物理內存)
      3. 字符串常量 1.7在永久代,1.8在堆
      4. MethodArea(方法區)邏輯概念-指的是永久代或元數據

c. 新生代 = Eden + 2個suvivor區

      1. YGC回收之後,大多數對象會被回收,活着的進入s0
      2. 再次YGC,活着的對象eden + s0 ->s1
      3. 再次YGC,eden+s1->s0
      4. 年齡足夠->老年代
      5. s區裝不下->老年代

d. 老年代

      1. 頑固分子
      2. 老年代滿了FGC

e. GC Tuning(Generation)

      1. 盡量減少FGC
      2. MinorGC = YGC
      3. MajorGC = FGC

截屏2020-10-14 下午2.04.51.png

  1. 常見的垃圾回收器

截屏2020-10-14 下午2.10.51.png

    1. Serial-年輕代 串行回收

截屏2020-10-14 下午2.14.41.png

b. PS-年輕代 並行回收

截屏2020-10-14 下午2.23.32.png

c. ParNew-年輕代 配合CMS的並行回收(PS和CMS不能配合使用,為了配合CMS,產生了ParNew)

截屏2020-10-14 下午2.27.20.png

d. SerialOld

e. ParallelOld

f. ConcurrentMarkSweep 老年代,垃圾回收和引用程序同時進行,降低STW的時間(200ms)

截屏2020-10-14 下午2.32.16.png

j. G1(10ms)

h. ZGC(1ms) PK C++

i. Shenandoah

g. Eplison

1.8默認的垃圾回收器: PS+ParallelOld

  1. JVM調優
    1. JVM命令行參數參考: 命令行
    2. 常用:
      1. -XX:+PrintFlagsFinal (打印所有最終生效值)
      2. -XX:+PrintFlagsInitial (打印默認值)
      3. -XX:+PrintCommandLineFlags (啟動時的命令行參數)
    1. JVM參數分類
      1. 標準:-開頭,所有的HotSpot都支持
      2. 非標準: -X開頭,特定版本HotSpot支持特定命令
      3. 不穩定: -XX開頭,下個版本可能取消