Perl6中的垃圾收集

参考计数

在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调用,但除了在阶段程序中运行的代码(间接)启动的垃圾收集之外,不会进行任何垃圾收集。

如果您始终需要有序关闭程序所使用的外部资源(例如数据库句柄),则可以使用位相器确保以正确和及时的方式释放外部资源。

例如,可以使用END相位器(称为END块(在Perl 5中),以便在程序退出时(无论出于何种原因)正确断开与数据库的连接:

DBIishconnect "Couldn't connect"
END disconnect

注意,END相位器不需要有块(如{ ... })在Perl 6中。如果没有,则相位器中的代码与周围的代码共享词法块(Lexpad)。

上面的代码有一个缺陷:如果程序退出以前数据库连接已经建立,或者如果数据库连接由于任何原因而失败,它将仍然尝试调用.disconnect方法中的任何内容。$dbh,这将导致执行错误。那里是然而,在perl 6中有一个简单的成语可以避免这种情况。用与.

END disconnect with  

后缀with只有在定义给定值(通常是实例化对象)并将其主题化为$_。.disconnect是缩写$_.disconnect.

如果您希望随时清理外部资源,那么范围退出,您可以使用LEAVE范围内的相位。

DBIishconnect ->
  LEAVE disconnect # no need for `with` here
  # do your stuff with the database
say "Could not do the stuff that needed to be done"

作用域if是左边的,任何LEAVE相位器将被执行。因此,每当代码在该范围内运行时,数据库资源将被释放。

摘要

尽管perl 6没有及时销毁perl 5用户习惯的对象,但是是吗?具有易于使用的替代方法,以确保外部资源的管理,类似于Perl 5中的方法。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • ASP.NET中HyperLink超链接控件的使用方法

    HyperLink(超链接) 作用:负责页面之间的导航 属性 值 作用 NavigateUrl url 将要跳转的页面地址(url) Font-Underline False 去除超链接下划线 一.HyperLink控件的基础使用 用到最多的无非就是NavigateUrl,既然是超链接,总得有个链接地址,下面看具体用法: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile=&quo

  • Perl字符串处理函数大全

    下面请看本文详细介绍. Perl字符串处理函数 1. index 语法: position=index(string,substring,position); 语义: 返回子串substring在字符串string中的位置,如果不存在则返回-1. 参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配. 2. rindex 语法: position=rindex(string,substring,position); 语义: 与index类似,区别是从右端匹配. 3. l

  • 强大的Perl正则表达式实例详解

    一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则的相关内容,方便后期查阅. 二.Perl正则例子 下面的例子可能有不足之处,有些来源于博客,没有验证: 1. 匹配IP地址:\d+\.\d+\.\d+\.\d+ \d:匹配一个数字字符,\d+:匹配一次或多次数字字符. \.:使用转义字符匹配'.'. 2. 匹配邮箱类似于123456@qq.com: /^[a-zA-Z

  • Perl中常见符号与操作

    注释: 1.单行: #print 2.多行:=pod -. =cut 查询perl相关: Perldoc perlvar($a,$$,$"...) Perldoc perfunc(sort-) Perldoc perl 查看perldoc文章列表 Perldoc –q 正则表达式 Perldoc –f 函数名 Perldoc module_name 查看模块 Perldoc –v 变量名 查看变量 Perldoc perlop 查看操作符 查看模块相关函数: 1.Perl –d –e 0 2.U

  • Perl时间处理函数用法介绍

    一. Perl时间的表示函数 1. 表示日期的方式多种多样: "18Jan1973"; "18/01/1973"; "01/18/1973"; "Jan181973"; "18-01-73"; "18-01-1973"; "01/73". 其中一些格式意思不清(如"01-06-1973",是表示6月1日呢,还是表示1月6日呢?) 如果不规定日期的表

  • Perl学习教程之单行命令详解

    前言 本文主要给大家介绍了关于Perl单行命令的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 与One-Liner相关的perl参数 -a 自动分隔模式,用空格分隔$并保存在@F中,也就是@F=split //, $ -F 指定-a的分隔符 -l 对输入的内容进行自动chomp,对输出的内容自动加换行符 -n 相当于while(<>) -e 执行命令,也就是脚本 -p 自动循环+输出,也就是while(<>){命令(脚本); print;} 记住以上几

  • Perl与JS的对比分析(数组、哈希)

    上一篇列出了Perl中定义数组,对象的方式与JS的异同.这里继续补充数组,哈希的相关操作. 一.数组 可以对数组进行增删,插入.与JS不同的是这些函数都是全局的,JS则是挂在Array.prototype上. 1,对数组尾部的操作pop(删除最后的元素).push(在尾部添加) @goods = qw/pen pencil/; pop(@goods); # @goods 变成 (pen) push(@goods, 'brush'); # @goods 变为 (pen, brush) 在Perl中

  • 使用Perl生成随机密码

    可以通过参数控制生成密码中包括的字符种类 #!/usr/bin/perl use strict; use warnings; use Getopt::Std; sub show_help { print "Useage:\n"; print "newp -aAnsl\n"; print "-a\t\t the password contains lower case letters(a-z)\n"; print "-A\t\t the

  • Perl中的符号 ->;、=>; 和 :: 分别表示什么意思?

    What do the ->, => and :: symbols mean? The -> is the "infix dereference operator". In other words it is the means by which one calls a sub with a pass by reference (among other things you can do with ->). As stated above most things

  • 详解linux下批量替换文件内容的三种方法(perl,sed,shell)

    在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用perl ,命令如下: 复制代码 代码如下: find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g' 方法二 使用sed命令如下: 复制代码 代码如下: sed -i "s/原字符串/新字符串/g" `grep 原字符串

  • 将Perl5代码迁移到Perl6上的解决方案

    无论您是一个正在将Perl 5代码转换为Perl 6并遇到一些问题的程序员,还是您只是想了解如果您尝试将Perl 5程序移植到Perl 6可能会发生什么,本文应该回答您的问题. Perl 6文档已经包含了大部分(如果不是全部)你需要的文件要解决将Perl 5代码迁移到Perl 6时所面临的问题,请执行以下操作.但是,正如文件所述,重点是事实上的差异.我将尝试更深入地讨论具体问题,并根据我将相当多的Perl 5代码移植到Perl 6的经验,提供更多的第一手信息. Perl 6怎么样? 很好,谢谢!

  • Perl5和Perl6对比使用Sigils的差别

    我们将看到Sigls(变量名称开头处的符号)Perl 5和Perl 6之间的差别. 概述 让我们从Perl 5和Perl 6中的Sigils概述开始: 符号 Perl5 Perl6 @   Array  Positional %   Hash  Associative &  Subroutine  Callable $  Scalar  Item *  Typeglob N/a @(Array vs. Positional) 在perl 5中定义数组时,可以创建一个可扩展的标量值列表,并给它一个

随机推荐