![]() |
1
3
在GC运行之前,RTS不知道是否有任何数据段未被引用。GHC没有引用计数GC,这将允许对垃圾立即执行操作。您可以尝试自己实现引用计数,或者使用
Haskell land没有跟踪外国分配。如果您想要更多的控制,但没有自定义GC或引用计数,您可以使用例如。
另一种选择是在GHC RTS中使用固定分配。这将为您提供GC不会移动的内存。对固定数据的引用可以无开销地传递给外部代码,但固定数据可以被跟踪,可以是GC-d,并像通常的堆数据一样触发GC。
Here's
一个用于固定数据的API。另一种选择是
|
![]() |
2
1
理解指针何时变为未引用并非易事。 据我所知,没有办法执行您的请求,即通知GC现在不再可以访问指针。充其量,可以触发一个GC循环,但没有硬性保证。 根据您的描述,您可能更喜欢引用计数机制,而不是垃圾收集。然而,特别是在复杂的纯代码中,很难确定计数器应该递增或递减的点:在基于状态或IO的单子中,如果这些副作用在计算的其余部分正确排序,则更容易确定。
如果您真的不需要引用计数超过“1”,那么一个常见的习惯用法是使用
例如,一个微不足道的实现可能是
然后可以将其用作
请注意,这并不是完全安全的,因为可能会返回指针,使其在解除分配后处于活动状态
一个正确的指针处理例程应该像
尽管如此,人们还是可以忍受天真
另一个不安全问题是由
|
![]() |
codeforester · 测量GC暂停时间的最佳方法是什么? 6 年前 |
![]() |
Venki WAR · 需要解释G1的并行完整GC 6 年前 |
![]() |
Stephan_Berlin · 为什么CMS系列中的初始标记阶段 7 年前 |
![]() |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 7 年前 |
![]() |
goks · 如何清除熊猫的数据帧内存? 7 年前 |