diff --git a/docs/java/jvm/JVM垃圾回收.md b/docs/java/jvm/JVM垃圾回收.md index ad4097c1..a0b7b504 100644 --- a/docs/java/jvm/JVM垃圾回收.md +++ b/docs/java/jvm/JVM垃圾回收.md @@ -282,7 +282,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 ### 3.1 标记-清除算法 -该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题: +该算法分为“标记”和“清除”阶段:首先标记出所有活动的对象,在标记完成后统一回收所有未被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题: 1. **效率问题** 2. **空间问题(标记清除后会产生大量不连续的碎片)** @@ -382,7 +382,7 @@ Parallel Scavenge 收集器也是使用复制算法的多线程收集器,它 - **初始标记:** 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ; - **并发标记:** 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。 - **重新标记:** 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短 -- **并发清除:** 开启用户线程,同时 GC 线程开始对为标记的区域做清扫。 +- **并发清除:** 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。 ![CMS 垃圾收集器 ](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-8-27/82825079.jpg)