-
Notifications
You must be signed in to change notification settings - Fork 46.1k
标记-清除法中被标记的对象 #82
Copy link
Copy link
Closed
Labels
enhancementNew feature or request or suggestionNew feature or request or suggestion
Description
在 搞定JVM垃圾回收就是这么简单 中 标记-清除法的描述为:
首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
我在网上搜索了一些资料,有的写的是 标记可回收对象,有的写的是 标记不可回收对象。
之后找到一个issues可供参考:
参考维基百科里的说法:
The first stage is the mark stage which does a tree traversal of the entire 'root set' and marks each object that is pointed to by a root as being 'in-use'.
被标记的应为 在用(不可回收)对象
https://en.wikipedia.org/wiki/Tracing_garbage_collection#Na.C3.AFve_mark-and-sweep
在CMS收集器这部分内容中描述有前后矛盾的地方:
初始标记: 暂停所有的其他线程,并记录下直接与root相连的对象,速度很快 ;
并发标记: 同时开启GC和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
并发清除: 开启用户线程,同时GC线程开始对为标记的区域做清扫。
标记阶段对不可回收对象标记,在清除时对标记区域清扫。不就是把不可回收对象清除掉了?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or request or suggestionNew feature or request or suggestion