我從一個網站上讀到了詞彙變量,他們解釋說, 使用「my」關鍵字聲明的變量是一個詞法變量。 它從使用my關鍵字聲明的地方直到當前塊的結尾。這是詞彙變量的範圍。Perl何時從內存中釋放它的詞彙變量?
我的疑問是,如果範圍完成,詞法變量是否從內存中解脫出來? 如果詞法變量在完成範圍意思之後沒有從內存中釋放,那麼它何時會從內存中釋放?任何人都可以向我解釋清楚嗎?
我從一個網站上讀到了詞彙變量,他們解釋說, 使用「my」關鍵字聲明的變量是一個詞法變量。 它從使用my關鍵字聲明的地方直到當前塊的結尾。這是詞彙變量的範圍。Perl何時從內存中釋放它的詞彙變量?
我的疑問是,如果範圍完成,詞法變量是否從內存中解脫出來? 如果詞法變量在完成範圍意思之後沒有從內存中釋放,那麼它何時會從內存中釋放?任何人都可以向我解釋清楚嗎?
詞法變量超出範圍時將被「釋放」。如果它指向一個具有循環引用的數據結構,那麼即使沒有其他人指向它,這個結構也不會被「釋放」。
此時可能需要指出'Scalar :: Util'和['weaken'](http://perldoc.perl.org/Scalar/Util.html#weaken)。 – Sobrique
Perl詞法變量喜歡保留它們的內存,以便下次詞法在範圍內時可以重用。通常,對於數字,引用,小字符串或哈希或數組元素少的數組,這並不重要。
對於包含大量元素的大型字符串或數組或哈希的詞彙,可以明確使用undef yourvarname
來釋放它們的內存。 (雖然這只是釋放內存以供Perl過程用於其他事情,但不會將其釋放到其他進程中。)
這裏有一些混淆。在Perl中,符號表中的變量和存儲在變量中的數據的內存都有內存。但是在任何情況下,Perl池都會「釋放」內存,以便稍後重用它。
在子程序返回之前,變量的內存不會被合併。這是在循環的情況下,其中相同的內存將被重用於變量。
數據的內存不合並,直到其引用計數變爲零。當您想要將數據返回到調用子例程時,這很有用。如果在子程序返回時釋放內存,則數據將丟失。
經驗法則是:除非您創建循環引用,否則Perl將爲您處理垃圾回收。
第二條經驗法則:不要創建循環引用。
嚴格地說,你並不知道。討論內存使用情況時,官方文檔有點小心。如果和當內存被釋放是由perl內部決定的。對你的問題的任何答案都是基於對內部信息的瞭解(或推測),這些信息可能會發生變化。也就是說,有幾件事我們可以知道:
除此之外沒有保證,雖然perlguts提供了一些洞察內部的行爲:
Perl使用引用計數驅動的垃圾回收機制。 SVs, AV或HV(以下簡稱xV)以 引用計數爲1開頭。如果xV的引用計數降至0, 那麼它將被銷燬並且其內存可供重用。
這通常不會發生在Perl級別,除非變量未被取消,或者最後一個變量保存對其的引用被更改,或者 被覆蓋。
內存「可用於重複使用」與釋放不完全相同。它允許perl爲其他內容使用內存,但不會將其返回到操作系統。在退出之前,您不應該期望perl將內存返回到操作系統。
從開發者的角度來看,我對管理的內存使用情況的建議是:
undef %hash
)做這些事情不一定會導致內存被釋放/重用,但它最大限度地提高了它的可能性。
http://www.perlmonks.org/?node_id=266845 –
當perl代碼完成並退出時,那時只有所有變量的內存被釋放。我的理解是否正確?我只需要澄清。 –
是的,OS在perl退出時回收內存(並且當詞法超出範圍時,詞法變量立即回收到perl內存管理器)。 –