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开头,下个版本可能取消