当前位置: 首页 > 知识库问答 >
问题:

Rakudo Memory/垃圾收集技术

蓝逸仙
2023-03-14

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

我正在处理一些NativeCall模块,想知道如何调试内存泄漏。一些内存在C库中处理,我在那边处理得很好。我知道域是我的责任,MoarVM在那边无能为力。我可以在MoarVM域中做什么?检查悬空对象、循环引用等的最佳方法是什么?

有没有办法在一系列操作结束时,我认为我所有的Perl对象都超出了范围,可以说“运行垃圾收集并告诉我剩下的任何东西”?

我是否可以运行一些Rakudo/NQP/MoarVM特定的代码来帮助我?这不是为了在生产中发布,只是为了在开发过程中进行测试/诊断。

MoarVM中的垃圾收集提供了一个诱人的概述,但没有足够的信息让我对它做任何事情。

共有1个答案

谢诚
2023-03-14

首先,虽然在本例中,C端的内存泄漏不是您的问题,但值得一提的是,Rakudo安装了一个perl6-valgrind-m,它在valgrind下运行程序。在编写本机库绑定时,我已经多次使用它来找出segfaults和leaks。

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

如果您对可能泄漏的对象类型有任何了解,那么使用“查找”命令搜索该类型的对象可能会很有用。然后有一个path命令,显示该对象如何保持活动状态。查看不同堆快照之间的对象计数也很有用,以了解使用中的增长情况。遗憾的是,目前还没有快照差异功能。

需要注意的一点是,快照包括在VM上运行的所有内容。这意味着Perl 6编译器将位于内存中,以及一组用于存储内置语言的对象。(开发该工具是为了帮助跟踪编译器和内置程序中的托管泄漏,因此这被认为是一项功能。:-)不过,将来可能会有某种过滤方式。)

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

 类似资料:
  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在C 和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源。在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其

  • 问题内容: 我想向JVM注册一个回调,所以我知道何时进行垃圾回收。有什么办法吗? 编辑:我想这样做,以便可以在应用程序日志中发生垃圾收集时注销,这样我就可以查看它是否与我所看到的问题相关。启用- Xloggc很有帮助,但是将GC日志中的时间(自应用程序启动以来使用秒数)整合到我的主应用程序日志中有点棘手。 编辑2012年4月:从Java7u4开始,您可以从GarbageCollectorMXBea

  • 问题内容: 您可以简单地通过调用Java来进行垃圾回收,但有时这会使应用程序“停滞”。这样垃圾收集并避免停顿是一个坏主意: 还是可能导致更多问题? 问题答案: 是的,在大多数情况下,调用System.gc()是一个非常糟糕的主意。有例外,但例外很少,最好花一些时间来确保自己不会在GC环境中做会损害性能的事情,并且学习并确保自己了解gc的工作方式比尝试自己处理它要好得多。显式调用System.gc(

  • 问题内容: 是否有可能使Go中的垃圾收集器处理并释放通过C代码分配的内存?抱歉,我之前没有使用过C和cgo,因此我的示例可能需要澄清。 假设您有一些要使用的C库,并且该库分配了一些需要手动释放的内存。我想做的是这样的: 当Go运行时中没有对* Stuff的引用时,垃圾收集器是否可以调用Stuff.Free()? 我在这里有意义吗? 也许更直接的问题是:是否有可能通过编写一个在该对象的引用为零时运行