JAVA August 24, 2020

GC和GC Tuning

Words count 3.8k Reading time 3 mins. Read count 0

GC的基础知识

1. 什么是垃圾

C语言中申请内存: malloc free

C++: new delete

Java: new ?

自动内存回收,编程上简单,系统不容易出错

手动释放内存,容易出现两种类型的问题

  1. 忘记回收
  2. 多次回收

没有任何引用执行的一个对象或者多个对象(循环引用)

2. 如何定位垃圾

引用计数

根可达

image-20200824140704499

3 常见的垃圾回收算法

Mark-Sweep 标记清除

image-20200824141242052

位置不连续,产生碎片

Copying 拷贝

image-20200824141435132

没有碎片,浪费空间

Mark Compact 标记压缩

image-20200824141706246

没有碎片,效率偏低

4 JVM的分代模型

  1. 部分垃圾回收器使用的模型

  2. 新生代+老年代+永久代(1.7)/ 元数据区(1.8) Metaspace

    永久代 元数据 -Class

    永久代必须指定大小限制,元数据可以设置,可以不设置,无上限(受限于物理内存)

    字符串常量1.7-永久代 1.8-堆内存

    MethodArea逻辑概念-永久代、元数据

  3. 新生代=1个eden+2个survivor区,

    1. YGC回收之后,大多数的对象回被回收,或者对象会进入s0
    2. 再次YGC回收之后,活着的对象eden+s0->s1
    3. 再次YGC,eden+s1->s0
    4. 年龄足够->老年代(15 CMS 6)
    5. s区装不下-> 老年代

    image-20200824142839360

  4. 老年代

    1. 顽固分子
    2. 老年代满了FGC Full GC
  5. GC Tuning

    1. 尽量减少FGC
    2. MinorGC=YGC
    3. MajorGC=FGC

5 常见的垃圾回收器

image-20200824192701355

  1. Serial 年轻代 串行回收

image-20200824193030185

  1. Parallel Scavenge 年轻代 并行回收

    image-20200824193143792

  2. ParNew 年轻代 配合CMS的并行回收

    image-20200824193231987

  3. SerialOld

  4. ParallelOld

  5. Concurrent Mark Sweep 老年代 并发 垃圾回收和应用程序同时运行,降低STW的时间(200ms)

  6. G1(10ms停顿)

  7. ZGC(1ms)PK C++

  8. Shenandoah

  9. Eplison

JDK1.8默认的垃圾回收:PS+ParallelOld

6 JVM调用第一步,了解生产环境下的垃圾回收器组合

JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

JVM命令参数分类:

标准:-开头,所有的HotSpot都支持

非标准 -X开头,特定版本HostSport支持特定命令

不稳定:-XX开头,下个版本可能取消

java -XX:+PrintFlagsFinal 最终参数值

java -XX:+PrintFlagsInitial 默认参数值

java -XX:+PrintCommandLineFlags

0%