首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl中的垃圾回收

Perl中的垃圾回收
EN

Stack Overflow用户
提问于 2010-06-04 14:46:00
回答 4查看 10.3K关注 0票数 14

与Java不同,Perl使用引用计数进行垃圾收集。我曾经尝试搜索过一些关于Perl、智能指针和C++ GC的问题,但是没有理解Perl语言是如何处理循环引用问题的。

有人能解释一下Perl的垃圾收集器是如何处理循环引用的吗?有没有办法回收程序不再使用的循环引用内存,或者Perl完全忽略了这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-04 15:21:39

根据我的《编程Perl》第三版,在退出时,Perl 5会执行一次“代价高昂的标记和清除”来回收循环引用。您将希望尽可能地避免循环引用,否则直到程序退出时它们才会被回收。

Perl5确实通过Scalar::Utils模块提供了弱引用。

Perl6将转向可插拔的垃圾收集方案(好吧,underlying VM will have multiple garbage collection options和这些选项的行为可能会对Perl产生影响)。也就是说,您可以在各种垃圾收集器之间进行选择,也可以实现自己的垃圾收集器。想要一个复制收集器吗?好的。想要一个颜色收集器吗?你说对了。标记/清除、压缩等?为什么不行?

票数 13
EN

Stack Overflow用户

发布于 2015-11-20 06:42:08

简单的回答是,Perl5不会,而不是自动处理循环引用。除非您在代码中采取显式措施,否则任何包含循环引用的数据结构都不会被回收,直到创建它们的线程死亡。这被认为是一种可接受的折衷方案,因为它避免了运行时垃圾回收的需要,因为运行时垃圾回收会降低执行速度。

如果您的代码创建了具有循环引用的数据结构(即,树的节点包含回根节点的引用),则需要使用Scalar::Util模块来“削弱”指向根节点的引用。这些弱引用不会添加到它们所指向的引用计数中,因此当最后一个外部引用消失时,整个数据结构将被自动释放。

示例:

代码语言:javascript
运行
复制
use Scalar::Util qw(weaken);

...

    my $new_node = { content => $content, root => $root_node };
    weaken $new_node->{root};
    push @{$root_node->{children}}, $new_node;

如果您在向数据结构添加新节点时使用这样的代码,那么实际计算的对根的引用只有那些来自结构外部的引用。这正是你想要的。然后,一旦对根的最后一个外部引用消失,根以及它的所有子代都将被回收。

票数 5
EN

Stack Overflow用户

发布于 2010-06-04 15:21:46

看看Proxy Objects吧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2972021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档