Rakudo记忆/垃圾收集技术

时间:2018-02-09 14:17:55

标签: garbage-collection perl6 nativecall

我理解这个问题涉及特定于实现的域,但此时,Rakudo / MoarVM的具体答案对我也有帮助。

我正在研究一些NativeCall模块,并想知道如何调试内存泄漏。一些内存在C库中处理,我在那里有一个很好的处理。我知道域名是我的责任,MoarVM在那里没有什么可以做的。我可以在MoarVM域中做什么?什么是检查悬空物体,循环参考等的最佳方法?

在一系列操作结束时是否有办法,我认为我的所有Perl对象都超出范围说"运行垃圾收集并告诉我剩下的任何事情"?

我可以运行一些Rakudo / NQP / MoarVM特定代码来帮助我吗?这不是在生产中发布,仅用于我正在开发的测试/诊断。

Garbage Collection in MoarVM给出了一个诱人的概述,但没有足够的信息让我对它做任何事情。

1 个答案:

答案 0 :(得分:10)

首先,虽然在这种情况下泄漏的C端内存不是你的问题,但是值得知道Rakudo会在valgrind下安装运行程序的perl6-valgrind-m。在编写本机库绑定时,我已经多次使用它来计算段错误和泄漏。

为了查看由MoarVM管理的对象,可以让VM转储堆快照。它们在每次GC运行后进行,并且强制执行额外的GC运行,并在程序结束时拍摄最终快照。要记录快照,请使用--profile=heap运行。然后可以将输出文件提供给moar-ha,可以使用zef install App::MoarVM::HeapAnalyzer进行安装(它在Perl 6中实现,如果您希望以某种方式扩展它,可能值得知道帮助您解决问题)。

如果您知道哪些对象可能泄漏,那么使用find命令搜索该类型的对象会很有用。然后有一个path命令,显示该对象如何保持活动状态。查看不同堆快照之间的对象计数,查看正在使用的增长内容也很有用。不幸的是,还没有快照差异功能。

需要注意的一点是,快照包括在VM顶部运行的所有内容。这意味着Perl 6编译器将在内存中,以及来自语言内置函数的一堆对象。 (该工具的开发是为了帮助跟踪编译器和内置函数中的托管泄漏,因此这被认为是一个特性。:-)但是,某种过滤在未来可能是可行的。)

最后,你提到了循环引用。这些在Perl 6中不是问题,因为GC是通过跟踪完成的,而不是引用计数。

相关问题