栈上的黑色对象指向堆上的白色对象问题
来源:1-13 Go 语言的内存管理与垃圾回收
weixin_慕设计2382076
2021-06-22 00:40:24
曹大:根据强三色不变性,栈上的黑色对象指向堆上的白色对象是不合法的,但是如果这个白色对象堆上没有被其他对象引用,栈上又不会有写屏障,那么这个白色对象岂不是永远不会被标记为灰色或者黑色么?
2回答
Xargin
2021-06-22
课上的这个动画还有一种更复杂的情况,你可以看看:
https://www.figma.com/proto/tSl3CoSWKitJtvIhqLd8Ek/memory-management-and-and-garbage-collection?page-id=201%3A293&node-id=201%3A294&viewport=3552%2C382%2C0.5088089108467102&scaling=contain
Xargin
2021-06-22
栈上的黑指向了堆上的白,
说明这个堆上的白一定是从堆上某条链路断掉的对象:
比如这个,我们后续让 z 指向 D
但是要考虑到 Go 的屏障是混合屏障(包含了删除写屏障的逻辑),
所以堆上的链路在标记过程中断开的话(被 mutator 修改),被断开的那个对象一定会被标灰,
所以第二张图这样的情况不会出现,B -> D 断开的时候,D 会被标灰(就是 D 对象的 gcMarkbit = 1 && 进 wbBuf)
正常的应该是这样:
相似问题