2011-08-30 129 views
17

var Obj = function(){}; var X = new Obj();如何清除Javascript中的內存?

X = null正確清晰的記憶?

這也是等同的嗎?

var Obj = function(){}; 
var X = {}; 
X.obj = new Obj(); 
delete(X.obj); 

編輯 這似乎是,雖然刪除X.obj不會立即清晰的記憶,這將有助於垃圾收集。如果我不刪除X.obj,那麼仍然會有一個指向對象的指針,因此GC可能無法清除它。

雖然我正在採摘@ delnan的答案,如果您正在閱讀本文,您應該確定也可以閱讀Benubird的文章。

我也注意到我不小心寫了刪除(X)本來而不是刪除(X.obj) - 抱歉。

+0

你應該解釋爲什麼你有興趣在「清除記憶」。它是爲了減少內存使用量嗎?或爲了安全?或者其他原因? –

+0

爲了減少RAM使用/確保GC命中它 –

+0

我喜歡這個問題。不幸的是,與大多數內存管理環境一樣,最好的方法是讓GC完成它的工作。哦,看着參考。 –

回答

15

簡短的回答是,你不知道。 delete只是簡單地刪除了一個引用(而不是您嘗試使用它的方式,請參閱上面的鏈接 - delete是很少人真正理解的那些語言功能之一),僅此而已。這個實現爲你清除了內存,但當它(甚至嚴格地說 - 這就是爲什麼不應該依賴提供它們的GC'd語言的終結器)時它不是你的業務。請注意:

  • 只能刪除可證明無法訪問(即無法訪問它)所有代碼的對象。什麼引用誰通常相當明顯,至少在概念上。在處理大量關閉時,您只需要小心,因爲它們可能會捕獲比您想象的更多的變量。還請注意,通知正在清理正確
  • 在涉及JS事件處理程序和DOM元素的垃圾收集的舊版本(但可悲的仍然使用)的IE版本中存在一個錯誤。 Google(也許甚至是SO)應該在我的記憶中擁有更好的材料。

從好的一面來說,這意味着你不會得到懸掛指針錯誤或(當然保存上述陷阱)內存泄漏。

+0

因此在上面的代碼示例中,wouldn'新的Obj()通過垃圾收集從內存中刪除,因爲沒有指向它了? –

+0

在第一個片段之後,創建的對象不再被引用,因此可以收集。第二個錯誤使用'delete'(請參閱Benubird的鏈接),結果取決於實現是否允許刪除變量,但如果是,則沒有參考剩餘。否則,只要'X'超出範圍,對象就會變成垃圾回收。無論哪種方式,在對象無法再到達之後,在某個時間點之後,內存被釋放(不是直接的,除非通過難以置信的機會)。 – delnan

+0

我剛剛注意到我在我的代碼段中犯了一個錯字。我的意思是把刪除(X.obj)。那麼我應該刪除(X.obj)還是X.obj = null來加速GC? –

3

否 - Javascript運行GC時感覺就像它。

2

刪除方法只刪除引用 - 不是對象。任何其他的引用都會在等待垃圾收集器的時候被忽略。

JavaScript有它自己的GC,它會在沒有任何東西指向它們時運行並清理它們。

我仍然認爲這是一個很好的做法,以null對象。 刪除對象也有助於GC,因爲它會看到懸掛的東西,並說「我要吃掉你,因爲你們都是孤獨的(現在有些玩世不恭的笑)」。

你應該看看Deleting Objects in JavaScript

即使有一個GC,你還是要確保你的腳本性能爲人民的電腦,瀏覽器和fricken工具欄(和它們的數量)進行了優化,可能會有所不同。

0

JavaScript內存通常與Java類似 - 我的意思是(或者應該有)一個垃圾收集器,如果沒有對它的引用,它將刪除該對象。所以是的,簡單地「取消」引用是你應該「處理」釋放內存的唯一方式,真正的釋放是JS主機部分。

1

一般來說,Javascript中的內存管理是用戶代理特定的。垃圾收集器的基礎知識是通過引用計數。因此,通過將參考設置爲空(使用delete關鍵字或通過明確分配),可以確保清除參考,IF該對象沒有任何超出其創建範圍的引用。在這種情況下,GC將已經清除了範圍已經結束的任何對象或變量,而未明確將其設置爲null。

儘管有些事情需要注意,循環引用很容易在JS中創建,特別是在DOM元素和對象之間。必須注意清除(或不首先創建)對象內DOM元素的引用。如果您確實創建了與DOM有關的to/from引用,請確保通過將引用設置爲null(無論是在對象還是在DOM元素上)來顯式清除它們。如果有子對象引用/從DOM或localStorage,因爲這些引用將繼續存在,並且如果從子對父對象有任何引用,那麼只需將父對象設置爲null是不夠的,則父對象將在記憶因爲那個參考。

網頁實際上可以通過這種方式在您的內存中泄漏垃圾 - 在您離開之後,循環引用將對象和DOM元素保留在內存中,直到您重新啓動瀏覽器!

關於這個問題的文章:http://docstore.mik.ua/orelly/webprog/jscript/ch11_03.htm,和其他的詳細看:http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx