2016-11-29 21 views
6

我從一個網站上讀到了詞彙變量,他們解釋說, 使用「my」關鍵字聲明的變量是一個詞法變量。 它從使用my關鍵字聲明的地方直到當前塊的結尾。這是詞彙變量的範圍。Perl何時從內存中釋放它的詞彙變量?

我的疑問是,如果範圍完成,詞法變量是否從內存中解脫出來? 如果詞法變量在完成範圍意思之後沒有從內存中釋放,那麼它何時會從內存中釋放?任何人都可以向我解釋清楚嗎?

+0

http://www.perlmonks.org/?node_id=266845 –

+0

當perl代碼完成並退出時,那時只有所有變量的內存被釋放。我的理解是否正確?我只需要澄清。 –

+1

是的,OS在perl退出時回收內存(並且當詞法超出範圍時,詞法變量立即回收到perl內存管理器)。 –

回答

0

詞法變量超出範圍時將被「釋放」。如果它指向一個具有循環引用的數據結構,那麼即使沒有其他人指向它,這個結構也不會被「釋放」。

+3

此時可能需要指出'Scalar :: Util'和['weaken'](http://perldoc.perl.org/Scalar/Util.html#weaken)。 – Sobrique

6

Perl詞法變量喜歡保留它們的內存,以便下次詞法在範圍內時可以重用。通常,對於數字,引用,小字符串或哈希或數組元素少的數組,這並不重要。

對於包含大量元素的大型字符串或數組或哈希的詞彙,可以明確使用undef yourvarname來釋放它們的內存。 (雖然這只是釋放內存以供Perl過程用於其他事情,但不會將其釋放到其他進程中。)

2

這裏有一些混淆。在Perl中,符號表中的變量和存儲在變量中的數據的內存都有內存。但是在任何情況下,Perl池都會「釋放」內存,以便稍後重用它。

在子程序返回之前,變量的內存不會被合併。這是在循環的情況下,其中相同的內存將被重用於變量。

數據的內存不合並,直到其引用計數變爲零。當您想要將數據返回到調用子例程時,這很有用。如果在子程序返回時釋放內存,則數據將丟失。

經驗法則是:除非您創建循環引用,否則Perl將爲您處理垃圾回收。

第二條經驗法則:不要創建循環引用。

4

嚴格地說,你並不知道。討論內存使用情況時,官方文檔有點小心。如果和當內存被釋放是由perl內部決定的。對你的問題的任何答案都是基於對內部信息的瞭解(或推測),這些信息可能會發生變化。也就是說,有幾件事我們可以知道:

  • 當執行結束時,操作系統將回收由perl使用的內存。
  • 如果有任何對它的引用,則分配給變量的內存不能被釋放。

除此之外沒有保證,雖然perlguts提供了一些洞察內部的行爲:

Perl使用引用計數驅動的垃圾回收機制。 SVs, AV或HV(以下簡稱xV)以 引用計數爲1開頭。如果xV的引用計數降至0, 那麼它將被銷燬並且其內存可供重用。

這通常不會發生在Perl級別,除非變量未被取消,或者最後一個變量保存對其的引用被更改,或者 被覆蓋。

內存「可用於重複使用」與釋放不完全相同。它允許perl爲其他內容使用內存,但不會將其返回到操作系統。在退出之前,您不應該期望perl將內存返回到操作系統。

從開發者的角度來看,我對管理的內存使用情況的建議是:

  • 更多的數據不加載到內存中一次比是必要的。 (例如,如果可能,逐行讀取文件而不是sl))
  • 將變量聲明限制在最小合理範圍內。
  • 當數據不再需要時,不要保留對數據的引用。 (要麼讓它超出範圍,要麼明確地清除參考。)
  • 當不再需要它們時定義大的變量。 (例如,通過undef %hash

做這些事情不一定會導致內存被釋放/重用,但它最大限度地提高了它的可能性。