之前雖然知道函式作用域, 上下文, 作用域鏈, 閉包, 引用清除與標記清除等概念, 但是總覺得既然有標記清除, js就不怎麼會發生記憶體洩漏. 今天查了下資料, 梳理了一下, 記錄下來供以後開發時參考, 相信對其他人也有用.
function foo(arg)
如上**, 宣告了乙個全域性變數, 它不會被自動**, 所以會造成記憶體洩漏. 需要手動**, 改成如下所示:
方法一(推薦)
function foo(arg)
方法二function foo(arg)
var someresource = getdata();
setinterval(function()
}, 1000);
上面的計時器不斷的執行函式, 在執行的時候會呼叫外面的變數someresource, 所以someresource一直在記憶體中無法被釋放. 要修正這種記憶體洩漏只能設定乙個計時器的停止條件了.
var someresource = getdata();
setinterval(function()
}, 1000);
if(timesrun === 60)
$('#container').bind('click', function()).remove();
上面刪除了dom但是沒有刪除繫結的事件, 也會造成記憶體洩漏. 解決方法是先把事件清除再remove.
$('#container').bind('click', function()).off('click').remove();
var leaks = (function()
})()
leaks();
上面的leak被閉包所引用, 所以不會被**.解決方法是在執行操作之後釋放掉記憶體.
var leaks = (function()
})()
leaks();
有一種記憶體洩漏很常見, 但是不是那麼明顯, **如下:
window.onload=function outerfunction();
};
這是乙個很常見也用的較多的事件繫結**, 它實際上是閉包引起的記憶體洩漏問題. 首先我們在內層函式中宣告了乙個變數obj, 然後我們給obj繫結了乙個click事件, 這個click事件被外層window引用, 導致innerfunction()函式形成了乙個閉包, 雖然這個函式裡面沒有任何表示式, 但是其中的this指向了obj, 所以obj在**執行結束之後並不會被清除, 需要手動釋放.修改方法如下:
方法一(推薦):
window.onload=function outerfunction();
obj = null;
};方法二(不推薦):
function innerfunction(){};
window.onload=function outerfunction();
值得注意的是, jquery封裝了解決這種記憶體洩漏的方法, 它的原理是使用jquery快取來繫結事件, 所以存下下面的方法三. 但是為了保險起見, 還是建議使用方法一手動清除宣告的變數.
window.onload=function outerfunction());
};
使用chrome能夠很方便的檢視網頁的記憶體使用情況, 操作如下:
開啟開發者工具,選擇 network 右邊的 timeline 面板
在頂部的capture欄位裡面勾選 memory
點選左上角的錄製按鈕。
在頁面上進行各種操作,模擬使用者的使用情況。
一段時間後,點選對話方塊的 stop 按鈕,面板上就會顯示這段時間的記憶體占用情況。
Tomcat中的記憶體洩漏問題
停止tomcat服務的時候,log裡面報了不少的記憶體錯誤資訊。經查詢是tomcat6.0.24以後會檢測到的問題。leak cause detected by tomcat fixed by tomcat possible enhancements custom threadlocal class...
Visual Studio中檢測記憶體洩漏的方法
visual studio中檢測記憶體洩漏的方法 include 可以定位到發生記憶體洩露 所在的檔案和具體那一行,用於檢測 malloc 分配的記憶體 define crtdbg map alloc include include 把分配記憶體的資訊儲存下來,可以定位到那一行發生了記憶體洩露。用於...
C 中記憶體洩漏的檢測
首先我們需要知道程式有沒有記憶體洩露,然後定位到底是哪行 出現記憶體洩露了,這樣才能將其修復。最簡單的方法當然是借助於專業的檢測工具,比較有名如boundscheck,功能非常強大,相信做c 開發的人都離不開它。此外就是不 首先我們需要知道程式有沒有記憶體洩露,然後定位到底是哪行 出現記憶體洩露了,...