如何禁用 perl 的垃圾收集器?

Sam*_*Sam 2 perl garbage-collection

我有一个短暂的(快速完成)perl 脚本,但它使用足够的内存来触发垃圾收集器。反过来,收集所需的时间比其余的处理要多。

有没有办法禁用垃圾收集并让操作系统在脚本退出时执行它?

编辑 GC 在脚本中间暂停,而不是在最后。KILLing 它没有帮助。

mob*_*mob 6

在不执行全局销毁的情况下快速退出程序的两种方法:

  1. POSIX::_exit

这与 C 函数相同_exit()。它立即退出程序,这意味着缓冲的 I/O不会被刷新。

  1. kill您的主要流程与SIGKILL.

    kill 'KILL', $$;
    
    Run Code Online (Sandbox Code Playgroud)

  • 当然应该写成“kill KILL => $$;”:) (3认同)

Gri*_*nnz 5

正如评论中提到的,Perl 中的垃圾收集是一种引用计数机制,并且由不再被任何东西引用的值触发(无论是存储它的变量可能超出范围还是被分配了不同的值,它是一个操作子程序调用堆栈的一部分,它被传入,或实际引用)。

因此,为了防止值在程序退出前被清除,最简单的方法是与传统的内存意识智慧相反:从全局存储中引用值。

our $foo = \$something_to_keep_alive;
Run Code Online (Sandbox Code Playgroud)

或者,您可以 (ab) 使用循环引用将阻止引用计数递减直到全局销毁的事实。

$something->{self} = $something;
Run Code Online (Sandbox Code Playgroud)

这将导致值引用自身,即使是通过另一层完成的,直到循环中的一个引用被削弱、删除或达到全局破坏。再说一次,在正常情况下肯定要避免一些事情,因为它是一种设计使然的内存泄漏。