perl何时从内存中释放其词法变量?

时间:2016-11-29 07:53:19

标签: perl

我从一个网站上读到了关于词汇变量的内容,他们解释说, 使用" my"声明的变量keyword是一个词法变量。 它使用my关键字直到当前块结尾的地方。这是词汇变量的范围。

我的疑问是,如果范围已经完成,词汇变量是否从内存中释放出来? 如果完成范围意味着词汇变量没有从内存中释放出来,那么它何时会从内存中释放出来?谁能清楚地向我解释一下?

4 个答案:

答案 0 :(得分:6)

Perl词汇变量喜欢抓住他们的记忆,以便下次词汇在范围内时可以重复使用。通常,对于数字,引用,小字符串或散列或具有少量元素的数组,这并不重要。

对于包含大字符串或数组或具有大量元素的哈希的词法,您可以明确使用undef yourvarname释放其内存。 (虽然这只是释放了Perl进程用于其他事情的内存,但不会将其释放到其他进程。)

答案 1 :(得分:4)

严格来说,你真的不知道。在讨论内存使用时,官方文档有点谨慎。如果和释放内存的时间取决于perl内部。您的问题的任何答案都是基于对内部的了解(或推测),内部情况可能会发生变化。也就是说,我们可以知道几件事情:

  • 执行结束时,操作系统将回收perl使用的内存。
  • 如果有任何对它的引用,则无法释放分配给变量的内存。

除此之外没有任何保证,但perlguts提供了对内部行为的一些了解:

  

Perl使用引用计数驱动的垃圾收集机制。颗卫星,   AV或HV(以下简称xV)以a开始   引用计数为1.如果xV的引用计数降至0,   然后它将被销毁,其内存可供重用。

     

这通常不会发生在Perl级别,除非变量是   undef'ed或持有对它的引用的最后一个变量被更改或   覆盖。

“可以重复使用”的内存与被释放的内存并不完全相同。它允许perl将内存用于其他内容,但不会将其返回给操作系统。您不应期望perl在退出之前将内存返回到操作系统。

从开发人员的角度来看,我对管理内存使用的建议是:

  • 不要一次将更多数据加载到内存中。 (例如,如果可能的话,逐行读取文件而不是啜饮)
  • 将变量声明限制在最小的合理范围内。
  • 不再需要时,不要保留对数据的引用。 (要么让它超出范围,要么明确清除引用。)
  • 在不再需要大变量时取消定义。 (例如通过undef %hash

执行这些操作不一定会导致内存被释放/重用,但最大限度地提高了内存的可能性。

答案 2 :(得分:2)

这里有一些混乱。在Perl中,符号表中的变量有内存,变量中存储的数据有内存。但在所有情况下,Perl都会“释放”内存,以便以后可以重用它。

在子程序返回之前,不会合并变量的内存。这是循环的情况,其中相同的内存将被重用于变量。

在引用计数变为零之前,不会合并数据的内存。当您想要将数据返回到调用子例程时,这非常有用。如果在子程序返回时释放了内存,则数据将丢失。

经验法则是:除非您创建循环引用,否则Perl将为您处理垃圾收集。

第二条经验法则:不要创建循环引用。

答案 3 :(得分:0)

当词汇变量超出范围时,它将被“释放”。如果它指向具有循环referances的数据结构,则即使没有其他人指向它,该结构也不会被“释放”。

相关问题