栈上的黑色对象指向堆上的白色对象问题

来源: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

0

Xargin

2021-06-22

栈上的黑指向了堆上的白,

说明这个堆上的白一定是从堆上某条链路断掉的对象:

http://img.mukewang.com/climg/60d1838d09ebda4714400872.jpg

比如这个,我们后续让 z 指向 D

http://img.mukewang.com/climg/60d183ab0976ca7d14220672.jpg


但是要考虑到 Go 的屏障是混合屏障(包含了删除写屏障的逻辑)

所以堆上的链路在标记过程中断开的话(被 mutator 修改),被断开的那个对象一定会被标灰

所以第二张图这样的情况不会出现,B -> D 断开的时候,D 会被标灰(就是 D 对象的 gcMarkbit = 1 && 进 wbBuf)

正常的应该是这样:

http://img.mukewang.com/climg/60d1840c09c446ad10500470.jpg

0
heixin_慕设计2382076
回复
hargin
hp>哦哦,明白了,感谢曹大

h021-06-22
共5条回复

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程