如何禁用 perl 的垃圾收集器?
How to disable perl's garbage collector?
我有一个短暂的(快速完成)perl 脚本,它仍然使用足够的内存来触发垃圾收集器。反过来,收集比其余处理花费更多。
有没有办法禁用垃圾收集并让 OS 在脚本退出时执行?
编辑
GC 在脚本中间暂停脚本,而不是在最后。 KILL
没用。
在不执行全局销毁的情况下快速退出程序的两种方法:
This is identical to the C function _exit()
. It exits the program immediately which means among other things buffered I/O is not flushed.
kill
你的主进程 SIGKILL
.
kill 'KILL', $$;
如评论中所述,Perl 中的垃圾收集是一种引用计数机制,由不再被任何东西引用的值触发(无论是存储它的变量可能超出范围还是被分配了不同的变量)值、它所属的操作、它传递的子例程调用堆栈或实际的 reference).
所以为了防止一个值在程序退出之前被清除,最简单的方法是做与传统的内存意识智慧相反的事情:从全局存储中引用该值。
our $foo = $something_to_keep_alive;
或者,您可以(滥用)使用循环引用将阻止引用计数递减直到全局销毁的事实。
$something->{self} = $something;
这将导致值引用自身,即使通过另一层完成,直到循环中的引用之一被削弱、移除或达到全局破坏。同样,在正常情况下肯定会避免某些事情,因为这是设计使然的内存泄漏。
我有一个短暂的(快速完成)perl 脚本,它仍然使用足够的内存来触发垃圾收集器。反过来,收集比其余处理花费更多。
有没有办法禁用垃圾收集并让 OS 在脚本退出时执行?
编辑
GC 在脚本中间暂停脚本,而不是在最后。 KILL
没用。
在不执行全局销毁的情况下快速退出程序的两种方法:
This is identical to the C function
_exit()
. It exits the program immediately which means among other things buffered I/O is not flushed.
kill
你的主进程SIGKILL
.kill 'KILL', $$;
如评论中所述,Perl 中的垃圾收集是一种引用计数机制,由不再被任何东西引用的值触发(无论是存储它的变量可能超出范围还是被分配了不同的变量)值、它所属的操作、它传递的子例程调用堆栈或实际的 reference).
所以为了防止一个值在程序退出之前被清除,最简单的方法是做与传统的内存意识智慧相反的事情:从全局存储中引用该值。
our $foo = $something_to_keep_alive;
或者,您可以(滥用)使用循环引用将阻止引用计数递减直到全局销毁的事实。
$something->{self} = $something;
这将导致值引用自身,即使通过另一层完成,直到循环中的引用之一被削弱、移除或达到全局破坏。同样,在正常情况下肯定会避免某些事情,因为这是设计使然的内存泄漏。