Sam*_*Sam 2 perl garbage-collection
我有一个短暂的(快速完成)perl 脚本,但它使用足够的内存来触发垃圾收集器。反过来,收集所需的时间比其余的处理要多。
有没有办法禁用垃圾收集并让操作系统在脚本退出时执行它?
编辑
GC 在脚本中间暂停,而不是在最后。KILLing 它没有帮助。
在不执行全局销毁的情况下快速退出程序的两种方法:
这与 C 函数相同
_exit()。它立即退出程序,这意味着缓冲的 I/O不会被刷新。
kill您的主要流程与SIGKILL.
kill 'KILL', $$;
Run Code Online (Sandbox Code Playgroud)正如评论中提到的,Perl 中的垃圾收集是一种引用计数机制,并且由不再被任何东西引用的值触发(无论是存储它的变量可能超出范围还是被分配了不同的值,它是一个操作子程序调用堆栈的一部分,它被传入,或实际引用)。
因此,为了防止值在程序退出前被清除,最简单的方法是与传统的内存意识智慧相反:从全局存储中引用值。
our $foo = \$something_to_keep_alive;
Run Code Online (Sandbox Code Playgroud)
或者,您可以 (ab) 使用循环引用将阻止引用计数递减直到全局销毁的事实。
$something->{self} = $something;
Run Code Online (Sandbox Code Playgroud)
这将导致值引用自身,即使是通过另一层完成的,直到循环中的一个引用被削弱、删除或达到全局破坏。再说一次,在正常情况下肯定要避免一些事情,因为它是一种设计使然的内存泄漏。