首页 > 编程 > Perl > 正文

Perl6中的垃圾收集

2020-06-04 20:33:47
字体:
来源:转载
供稿:网友

参考计数

在perl 5中,通过参考计数。当在Perl 5中创建某物时,它的引用计数为1或更多,这使它保持活力。在最简单的情况下,如下所示:

# reference count of $a = 1, because lives in lexical pad# lexical pad is gone, reference count to 0

在Perl 5中,如果该值是一个对象,则DESTROY方法将被调用。

Foo-># $a->DESTROY called

如果不涉及外部资源,及时销毁只是管理程序使用的内存的另一种方式。作为一个程序员,你不需要关心如何以及什么时候被回收。话虽如此,如果您需要处理外部资源,例如数据库句柄(数据库服务器提供的数据库句柄通常只有有限的数量),那么及时销毁是一个非常好的特性。参考计数可以提供这一点。

然而,引用计数有几个缺点。它采用了perl 5核心开发人员。许多数年才能使参考计数正常工作。如果你在工作Xs,您总是需要知道引用计数,以防止内存泄漏或过早破坏。

在多线程环境中保持同步变得更加困难,因为您不希望同时丢失来自多个线程的引用的任何更新(因为这会导致内存泄漏和/或外部资源不被释放)。为了避免这种情况,需要进行某种锁定或原子更新,两者都不便宜。

请注意,perl 5 ithread更像是在解释器之间具有未共享内存的内存分叉,而不是像C这样的编程语言中的线程,因此,它仍然不需要对其引用计数进行任何锁定。

引用计数还有一个基本缺点:如果两个对象包含彼此的引用,它们将永远不会被销毁,因为它们将对方的引用计数保持在0以上(循环引用)。在实践中,这往往要深入得多,更像是A -> B -> C -> A,其中A,B和C都保持着彼此的生存。

a的概念弱参考是为了避开Perl 5中的这些情况而开发的。虽然这个能,会,可以修正循环引用问题,它具有性能含义,而不是首先解决循环引用(和查找)的问题。你需要知道哪里弱引用可以最佳方式使用;否则,您可能会得到不必要的过早对象销毁。

可达性分析

由于Perl 6的核心是多线程的,所以在早期阶段就决定了引用计数在性能和维护方面都是有问题的。相反,当需要更多内存时,对象就会从内存中被逐出。和该对象可以安全地移除。

在Perl 6中能,会,可以创建一个DESTROY方法,就像在Perl 5中一样。但是你。不可能确定何时(如果有的话)它将被调用。
不进则退太多细节,Perl 6中的对象只有在垃圾收集运行启动时才被销毁,例如,当达到一定的内存限制时。只有这样,如果内存中的其他对象无法再访问一个对象和它有一个DESTROY方法,它会在对象被移除之前调用吗?

当程序退出时,Perl 6不进行垃圾回收。适用相位器(如LEAVE和END) 将要GET调用,但除了在阶段程序中运行的代码(间接)启动的垃圾收集之外,不会进行任何垃圾收集。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表