首页 新闻 搜索 专区 学院

为什么gc时要停止所有线程?让其他线程也跑么,gc期间生成的垃圾在下一次gc时清除不就好了?

1
[待解决问题]

为什么gc时要停止所有线程?让其他线程也跑么,gc期间生成的垃圾在下一次gc时清除不就好了?

Comopu的主页 Comopu | 菜鸟二级 | 园豆:202
提问于:2019-05-10 20:09
< >
分享
所有回答(3)
0

CLR 的 GC是基于代的垃圾回收器,总共三代。 第0 代,第一代 第二代。我觉得JAVA 的JVM 也查不是很多。
CLR 开始GC时,会暂停进程中的所有线程,这是为什么呢?
主要是防止线程在CLR检查期间访问了某个对象改变了这个对象的状态。
聪明的你肯定也知道了垃圾回收最开始的阶段 会进行当前 托管堆中所有对象进行遍历,进行标记,有引用的 标记为 1 没有引用的标记为 0,标记为0 的则是GC需要回收的。

BUTTERAPPLE | 园豆:2950 (老鸟四级) | 2019-05-10 23:58
0

java也有弱引用吗?

吴瑞祥 | 园豆:28836 (高人七级) | 2019-05-11 00:33
0

现阶段jvm的stw主要发生在对象标记阶段,即使是号称低延迟的cms和g1收集器在初始阶段对可回收对象进行可达性分析的时候也需要短暂的stw,原因就是其他线程在执行的时候可能会改变对象的引用状态,比如在进行标记的时候已经被标记为可回收的对象可能被再次引用,就会造成回收了不能被回收的对象而出现问题

wollow | 园豆:202 (菜鸟二级) | 2019-05-11 11:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册