我有一个关于cms扫描阶段的问题,扫描阶段不会停止世界,考虑到下面的情况,指针c为null,不会被标记为可达,在备注阶段之后,c指针被修改为新对象,或者像c = b,b这样的东西是无法到达的,但是如果c指向它,它就变得可以到达,对于这两种情况,c会被收集吗?它没有在备注阶段标记,所以如果它被收集,我认为这是错误的。
你的问题有一个很大的误解。垃圾收集器收集对象,即它们占用的内存,而不是指针。
在标记阶段遍历指针以确定哪些对象可到达。当你的指针c
是null
时,它不会指向任何对象,也没有任何东西可以遍历。是否有无法到达的对象无法从c
确定,它只是没有贡献这个过程。重要的是,哪些指针指向一个对象,因为这些对象是可达的。遍历期间未遇到的所有对象都无法访问。
由于无法访问意味着不存在指向该对象的指针,因此后续指针赋值不能使无法访问的对象可达。当你做c = b
时,只有两种可能的场景,1)b
是null
,因此c
也将是null
赋值或2)b
指向一个对象,当然,在标记阶段已被标记为可达,所以现在还有一个指向该可到达对象的指针,它不会改变其可达性。
在并发扫描阶段期间可能发生的唯一变化是标记为可达的对象可能同时变得不可达,例如,如果c
是唯一指向对象的指针,则并发c = b
会使该对象无法访问。然而,这只是意味着该对象仍然被视为在这个席卷阶段可以访问,并且需要在下一个垃圾收集周期中收集。