在收集时,垃圾收集器将所有活动对象复制到另一个内存空间,从而丢弃进程中的所有垃圾对象。指向新空间中复制对象的前向指针安装到对象的“旧”版本中,以确保收集器正确更新对该对象的所有剩余引用,并且不会错误地将同一对象复制两次。
这显然适用于停止世界的收藏家。然而,由于 stop-the-world 的暂停时间很长,现在大多数垃圾收集器允许 mutator 线程与收集器并发运行,只在短时间内停止 mutator 以进行初始堆栈扫描。
那么收集器如何确保在复制对象时/之后不会访问对象的“旧”版本?我想变异器可以检查带有某种读取障碍的前向指针,但这对我来说似乎代价高昂,因为变量被经常读取。