Rakudo内存/垃圾回收技术

10

我知道这个问题涉及到实现特定的领域,但是在这一点上,Rakudo/MoarVM特定的答案也会对我有所帮助。

我正在开发一些NativeCall模块,并想知道如何调试内存泄漏。一些内存被处理在C库中,我已经很好地掌握了那里的情况。我知道该领域是我的责任,MoarVM在那里无能为力。那么在MoarVM领域中我该怎么做?检查悬空对象、循环引用等最佳方法是什么?

在一系列操作结束时,是否有一种方式可以说“运行垃圾回收并告诉我剩下的所有内容”?我认为所有的Perl对象都已经超出范围。

是否有一些Rakudo/NQP/MoarVM特定的代码可以帮助我?这不是要在生产环境中发布,只是在开发过程中用于测试/诊断。

MoarVM中的垃圾回收提供了一个令人兴奋的概述,但对我来说还不足以做出什么实际操作。

1个回答

11
首先,虽然在此情况下C端泄漏的内存不是您的问题,但值得知道的是Rakudo安装了perl6-valgrind-m,在valgrind下运行程序。写本地库绑定时,我已经使用过多次来解决段错误和泄漏问题。
要查看MoarVM管理的对象,可以获取VM以转储堆快照。它们在每次GC运行后进行拍摄,并强制进行额外的GC运行,并在程序结束时进行最终快照。要记录快照,请使用--profile=heap运行。然后可以将输出文件提供给moar-ha,可以使用zef install App::MoarVM::HeapAnalyzerto安装它(它是用Perl 6实现的,如果您希望以某种方式扩展它以帮助您解决问题,则可能值得知道)。
如果您有任何关于可能泄漏的对象类型的想法,则可以使用find命令搜索该类型的对象,这可能很有用。然后有一个path命令显示该对象如何被保持活动。还可以查看不同堆快照之间的对象计数,以查看使用情况的增长情况。不幸的是,目前还没有快照差异功能。
需要注意的一点是快照包含在VM上运行的所有内容。这意味着Perl 6编译器将保存在内存中,以及来自语言内置内容的一些对象。 (该工具是为帮助跟踪编译器和内置内容中的管理泄漏而开发的,因此这被认为是一个功能。 :-)未来可能实现某种过滤。)
最后,您提到了循环引用。这在Perl 6中不是问题,因为通过追踪而不是引用计数来完成GC。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接