簡體   English   中英

信任Javascript垃圾收集器

[英]Trusting Javascript garbage collector

我有幾個實例,我的Javascript代碼似乎正在泄漏內存,但是我不確定應該從垃圾收集器中得到什么。

例如,在Firefox中運行的間隔計時器函數中的var = new Object()似乎會隨時間泄漏。 有一些簡單的解決方案,但是我很好奇我是否應該期望垃圾收集器能夠處理所有事情,或者我有責任幫助垃圾收集器。

如果我需要幫助垃圾收集器,有哪些規則?

大多數(我相信都是)Javascript(ECMAScript)引擎通過一種稱為“引用計數”的方法來工作。 我讓你去看看這個詞。

簡而言之,當沒有對象指向對象時,可以釋放對象以使用它。

有兩件事可能會使您對正在使用的內存量有所了解。

1)ECMAScript不會在系統完成操作后立即釋放該對象。 垃圾收集“根據需要”運行。 這可能差異很大。

2)閉包可以保留的參考時間超出您的想象。 意外的關閉可能會使事物的保存時間超出您的預期。

必須使這個答案而不是長度的評論:

好-首先要澄清術語:

如果它在計時器上運行,則它不是遞歸的。 但是,這是一個普遍的誤解。

它是遞歸代碼,一個函數調用它自己-原始函數調用將保留在堆棧上,直到最終完成整個處理並將一個值返回給原始調用者為止。 使用超時時,函數的每次迭代都在單獨的執行上下文中進行。

遞歸函數示例函數factorial(n){if(n == 1){return 1; } else {return n * factorial(n-1); }}

這是/ not /遞歸的:function annoy(){window.setTimeout(annoy,1000); window.alert(“這將每秒煩人!”); }

“ annoy”的每個迭代都是完全獨立的,並且是獨立的。 它只是為要調用的另一個實例設置了計時器。 堆棧上沒有一堆“討厭的”函數,您不能將任何東西返回給調用者。

第二:在我給您的示例中,變量a不會超出范圍,但是a引用的舊對象沒有活動引用,因此可以自由發布。 變量指向的內容可以變化。

var a, b;
a = {};
b = a;   // This object now has TWO references using it.

b = null;  // The object now has one reference
a = null;  // Object has no references and is free for release.

此時,我能做的最好的事情就是將您指向此處:

http://www.ibm.com/developerworks/web/library/wa-sieve/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM