在具有自动垃圾回收的语言(例如Haskell或Go)中,垃圾回收器如何找出存储在堆栈中的哪些值是指向内存的指针,而哪些只是数字?如果垃圾收集器仅扫描堆栈并假定所有地址都是对对象的引用,则许多对象可能会被错误地标记为可访问。显然,可以在每个堆栈帧的顶部添加一个值,该值描述了接下来的指针中有多少个值,但这是否会花费很多性能呢?在现实中是如何做到的?
3 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
如前所述,存在假设,那就是东西GC的管理地址的每个位模式的GC是实际上是一个指针(所以不要松开东西)。这实际上可以很好地工作,因为调用指针通常大于小的公共整数,并且通常必须对齐。但是是的,这可能导致某些对象的收集被延迟。Boehm C的收集器以这种方式工作,因为它是基于库的,因此不会从编译器获得任何特定的帮助。
还有一些GC与它们所使用的语言紧密相关,并且实际上知道内存中对象的结构。我从没专门阅读过堆栈帧处理方面的文章,但是如果编译器和GC设计为可以协同工作,则可以记录信息以帮助GC。一种技巧是将所有指针引用放在一起,并在每个堆栈帧中使用一个字来记录有多少个指针,这并不是那么大的开销。如果您可以找出与每个堆栈框架相对应的功能而无需添加一个单词,那么您可以编译每个功能的“堆栈框架布局图”。另一种选择是使用带标签的单词,在该位置设置低不是指针1的单词的顺序位(由于地址对齐),指针永远不需要,因此您可以将它们区分开。
万千封印
TA贡献1891条经验 获得超3个赞
Haskell堆栈在每个堆栈帧中使用一个内存字(使用位图)描述该堆栈帧中的哪些值是指针,哪些不是指针。
公平地说,考虑到所有因素,仅需一个内存字就不会花费太多。您可以将其视为仅向每个方法添加一个变量。那还不是那么糟糕。
- 3 回答
- 0 关注
- 199 浏览
添加回答
举报
0/150
提交
取消