2011-03-03 305 views
8

我調用一個函數的第二,做一些昂貴的東西,因爲它是一個<canvas>元素很多畫50次。內存泄漏

它的偉大工程,沒有問題,但我只是看了一下內存使用情況,並偷了我的1MB RAM的第二位。 Chrome似乎是垃圾收集,因爲它每分鐘左右都在下降,但隨後使用量再次增長。

我試過是把return在某些地方在我的功能,從而決定什麼我的部分功能是什麼導致了泄漏。我已經能夠將它縮減爲特定的代碼行,之後會出現邪惡部分,但我不知道如何解決它。

我的問題是:

  • 什麼工具可以有效地測量在Chrome的JavaScript內存泄漏?
  • 難道是有效的,他們一直在使用後的變量設置爲null/undefined,像他們處置?

如果源代碼是真的有必要我會毫不猶豫它張貼在這裏,但我必須承認,這是長期和別人也許有點ununderstandable。

回答

9

我只是要拉這句話直接從文章中鏈接;

說到內存泄漏,打破循環引用 - 泄漏的原因 - 通常使用簡單的空賦值來完成。通常不需要使用刪除。此外,null'ing允許「取消引用」變量 - 刪除通常無法執行的操作。

var el = document.getElementById('foo'); 
// circular reference is formed 
el.onclick = function() { /* ... */ }; 
// circular reference is broken 
el = null; 
// can't `delete el` in this case, as `el` has DontDelete 

由於這些原因,最好打破循環引用時堅持null'ing。

delete Explained

+0

其實,我沒有循環引用。這是所有定製的'Vector'類,它們代表了我的渲染器函數中的3D和2D點。如果我每秒撥打50次這個功能,我想他們正在記憶中積累。零空仍然有幫助嗎?我一直在嘗試無用,都使用'delete'和'= null'。 – pimvdb 2011-03-03 15:49:24

+0

@pimvdb閱讀文章,它很長,但非常全面地展示了刪除實際如何工作。我不能說任何一種選擇對你而言都是成功的。 js泄漏總是b ** ch。 – Andrew 2011-03-03 15:59:01

3

看在Chrome的開發者工具有關內存使用信息的配置文件選項卡下的一堆資料。

可以執行以下操作以防止內存泄漏:

  • 測試你與JSLint代碼,看看是否會給你一些指點。
  • 使用var關鍵字給你的變量函數作用域,所以當它們超出範圍時可以進行垃圾回收。沒有var關鍵字變量具有全局範圍。
  • 使用delete variable;語句刪除對象以及內存中的引用。將變量設置爲null只會從內存中刪除對象,而不是其引用。
+0

感謝。你可能知道for循環變量(例如'i')是否會在for循環結束後自動處理? – pimvdb 2011-03-03 14:51:26

+4

@pimvdb:它不會,因爲只有函數在javascript中定義範圍。閱讀更多關於JavaScript範圍的信息:http://www.adequatelygood。com/2010/2/JavaScript-Scoping-and-Hoisting – 2011-03-03 15:01:14