我从一个网站上读到了关于词汇变量的内容,他们解释说, 使用" my"声明的变量keyword是一个词法变量。 它使用my关键字直到当前块结尾的地方。这是词汇变量的范围。
我的疑问是,如果范围已经完成,词汇变量是否从内存中释放出来? 如果完成范围意味着词汇变量没有从内存中释放出来,那么它何时会从内存中释放出来?谁能清楚地向我解释一下?
答案 0 :(得分:6)
Perl词汇变量喜欢抓住他们的记忆,以便下次词汇在范围内时可以重复使用。通常,对于数字,引用,小字符串或散列或具有少量元素的数组,这并不重要。
对于包含大字符串或数组或具有大量元素的哈希的词法,您可以明确使用undef yourvarname
释放其内存。 (虽然这只是释放了Perl进程用于其他事情的内存,但不会将其释放到其他进程。)
答案 1 :(得分:4)
严格来说,你真的不知道。在讨论内存使用时,官方文档有点谨慎。如果和释放内存的时间取决于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的数据结构,则即使没有其他人指向它,该结构也不会被“释放”。