js中的記憶體洩漏

2022-03-04 12:07:49 字數 2061 閱讀 7458

之前雖然知道函式作用域, 上下文, 作用域鏈, 閉包, 引用清除與標記清除等概念, 但是總覺得既然有標記清除, 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 開發的人都離不開它。此外就是不 首先我們需要知道程式有沒有記憶體洩露,然後定位到底是哪行 出現記憶體洩露了,...