为什么cms的扫描阶段不必停止世界?

时间:2018-03-01 05:25:02

标签: garbage-collection jvm

我有一个关于cms扫描阶段的问题,扫描阶段不会停止世界,考虑到下面的情况,指针c为空,不会被标记为可达,在备注阶段之后,c指针被修改为一个新的对象,或者像c = b,b这样的东西是不可达的,但是如果c指向它,它就变得可以到达,对于这两种情况,c会被收集吗?它没有在备注阶段标记,所以如果它被收集,我认为这是错误的。

1 个答案:

答案 0 :(得分:1)

你的问题存在很大的误解。垃圾收集器收集对象,即它们占用的内存,而不是指针。

在标记阶段遍历指针以确定哪些对象可以到达。当指针cnull时,它不指向任何对象,并且没有任何东西可以遍历。是否存在无法访问的对象无法从c确定,它只是对此过程没有贡献。重要的是,哪些指针指向一个对象,因为这些对象是可以访问的。遍历期间未遇到的所有对象都无法访问。

由于无法访问意味着没有指向该对象的指针,因此没有后续指针赋值可以使无法访问的对象可达。执行c = b时,只有两种可能的情况,1)bnull,因此c在作业后也会null或2) b指向一个对象,当然,在标记阶段已将其标记为可达,因此现在还有一个指向该可到达对象的指针,该指针不会改变其可达性。

在并发扫描阶段期间可能发生的唯一变化是标记为可达的对象可能同时变得不可达,例如,如果c是指向对象的唯一指针,则并发c = b会使该对象无法访问。然而,这只是暗示这个对象仍被视为在这个席卷阶段可以访问,需要在下一个垃圾收集周期中收集。