From 430010a3e37d40a9823c7e3e29b196bb0dc9231a Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Wed, 24 Jun 2020 10:00:12 +0800 Subject: [PATCH] Update G1 --- blogs/JVM/G1.md | 23 +++++++++++++++++++++ blogs/Java/口水话/JVM 相关口水话.md | 3 +++ 2 files changed, 26 insertions(+) create mode 100644 blogs/JVM/G1.md diff --git a/blogs/JVM/G1.md b/blogs/JVM/G1.md new file mode 100644 index 0000000..8502c37 --- /dev/null +++ b/blogs/JVM/G1.md @@ -0,0 +1,23 @@ +--- +G1 +--- + +Garbage First(G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式。它和 CMS 同样是一款主要面向服务端应用的垃圾收集器,不过在 JDK9 之后,CMS 就被标记为废弃了。在 G1 收集器出现之前的所有其他收集器,包括 CMS 在内,垃圾收集的目标范围要么是整个新生代(Minor GC),要么就是整个老年代(Major GC),在要么就是整个 Java 堆(Full GC)。而 G1 是基于 Region 堆内存布局,虽然 G1 也仍是遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1 不再坚持固定大小以及固定数量的分代区域划分,而是把连续的 Java 堆划分为多个大小相等的独立区域(Region),每一个 Region 都可以根据需要,扮演新生代的 Eden 空间、Survivor 空间或者老年代。收集器根据 Region 的不同角色采用不同的策略去处理。G1 会根据用户设定允许的收集停顿时间去优先处理回收价值收益最大的那些 Region 区,也就是垃圾最大的 Region 区,这就是 Garbage First 名字的由来。 + +G1 收集器的运作过程大致可划分为以下四个步骤: + +1.初始标记 + +仅仅只是标记一下 GC Roots 能直接关联到的对象,这个阶段需要停顿线程,但耗时很短。 + +2.并发标记 + +从 GC Root 开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但是可与用户程序并发执行。 + +3.最终标记 + +对用户线程做另一个短暂的暂停,用于处理在并发标记阶段新产生的对象引用链变化。 + +4.筛选回收 + +负责更新 Region 的统计数据,对各个 Region 的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划。 \ No newline at end of file diff --git a/blogs/Java/口水话/JVM 相关口水话.md b/blogs/Java/口水话/JVM 相关口水话.md index 7424604..05f197e 100644 --- a/blogs/Java/口水话/JVM 相关口水话.md +++ b/blogs/Java/口水话/JVM 相关口水话.md @@ -7,6 +7,9 @@ JVM 相关口水话 3. 内存分配回收策略 4. Java 对象的创建、内存布局和访问定位 5. GC + 1. 引用计数及可达性分析 + 2. 垃圾回收算法 + 3. 垃圾收集器 6. 类加载机制 7. 双亲委派模型 8. 编译器优化