Cur*_*mes 9 garbage-collection perl6 nativecall
我理解这个问题涉及到特定于实现的域,但在这一点上,Rakudo/MoarVM的具体答案对我也有帮助.
我正在研究一些NativeCall模块,并想知道如何调试内存泄漏.一些内存在C库中处理,我在那里有一个很好的处理.我知道域名是我的责任,MoarVM在那里没有什么可以做的.我可以在MoarVM域中做什么?检查悬空物体,循环参考物等的最佳方法是什么?
在一系列操作结束时是否有一种方法,我认为我的所有Perl对象都超出范围说"运行垃圾收集并告诉我任何事情"?
我可以运行一些Rakudo/NQP/MoarVM特定代码来帮助我吗?这不是为了在生产中发布,只是为了在我开发时进行测试/诊断.
MoarVM中的垃圾收集提供了一个诱人的概述,但没有足够的信息让我对它做任何事情.
Jon*_*ton 10
首先,虽然在这种情况下泄漏的C端内存不是你的问题,但值得知道Rakudo perl6-valgrind-m在valgrind下安装运行程序.在编写本机库绑定时,我已经多次使用它来弄清楚段错误和泄漏.
为了查看由MoarVM管理的对象,可以让VM转储堆快照.它们在每次GC运行后进行,并且强制执行额外的GC运行,并在程序结束时拍摄最终快照.要记录快照,请运行--profile=heap.然后可以输出输出文件moar-ha,可以使用zef install App::MoarVM::HeapAnalyzer它安装(它在Perl 6中实现,如果你希望以某种方式扩展它以帮助你解决问题,这可能是值得的).
如果您知道哪些对象可能泄漏,那么使用该find命令搜索该类型的对象会很有用.然后有一个path命令显示该对象如何保持活动状态.查看不同堆快照之间的对象计数,查看正在使用的增长内容也很有用.不幸的是,还没有快照差异功能.
需要注意的一点是,快照包括在VM顶部运行的所有内容.这意味着Perl 6编译器将在内存中,以及来自语言内置函数的一堆对象.(该工具的开发是为了帮助追踪编译器和内置函数中的托管泄漏,因此这被认为是一个特性.:-)但是,某种过滤在未来可能是可行的.)
最后,您提到了循环引用.这些在Perl 6中不是问题,因为GC是通过跟踪而不是引用计数完成的.