jQuery1 72 記憶體洩露追蹤(附解決方案)

2022-01-14 04:03:52 字數 2301 閱讀 6152

非同步**,解析html,過濾出某一部分,載入到頁面。

html = $(html) ;

經查: jquery在解析html時,會有記憶體洩露。追蹤的執行**如下:

1. init:

if (typeof selector === "string")

ret = jquery.buildfragment([match[1]], [doc]);

2. buildfragment

jquery.clean(args, doc, fragment, scripts);

3.clean 這才是核心,還不明白為什麼起這個名字。 分析文章: 

div = context.createelement("div"),      // 重點關注物件 .

safechildnodes = safefragment.childnodes,  //safefragment 是在載入完jquery之後執行的。 它只是進行了建立,並沒有追加到 dom 中。

div.innerhtml = wrap[1] + elem + wrap[2];  //記憶體開始增長。之後並沒有回落,懷疑是清理有問題。

div.parentnode.removechild(div);    //很明顯,作者想到了要清理,但根據監測結果,記憶體並沒有回落。在html內容很大的情況下,觀察效果明顯。

作者的方案是,建立div,把它新增到 fragment,再設定 innerhtml,和網上流傳的

url: 

出現這種記憶體洩漏需要有三個條件:

1. 記憶體中存在乙個未加入dom樹的元素

2. 給這個元素設定innerhtml,注意,必須是能建立元素並且繫結了dom 0級事件

3. 必須在這個元素加入dom樹前設定它的innerhtml

思想如出一轍,但有不同。

把我的**按網上方案進行改造。

var div = document.createelement("div");

div.innerhtml = html ;

html = $(div.childnodes );

...document.body.removechild(div);

使用上述方法後,發現ie下設定 innerhtml 後 childnodes 是一坨 html **,並沒有解析成物件。除錯jquery**發現,jquery解析時,執行了如下**:

1. 在 init 裡: 

match = quickexpr.exec(selector);

2. 在 clean 函式 時:

elem = elem.replace(rxhtmltag, "");

而且,它在設定 innerhtml 時,進行發如下操作:

div.innerhtml = wrap[1] + elem + wrap[2];

綜合jquery寫法,修改如下:

html = /^(?:[^#)[^>]*$|#([\w\-]*)$)/.exec(html) ;

html = html[1].replace(/]*)\/>/ig, "") ;

var div = document.createelement("div");

div.innerhtml = "div" + html +"

";html =$(div.lastchild.childnodes);

... document.body.removechild(div);

使用 drip,進行測試,使用 show memory usage 檢視,記憶體增加非常小,使用 show dom usage 檢視,曲線還是很明顯(但點show dom leaks,頁面會變白)

使用 sieve 進行測試,使用 show memory usage 檢視,記憶體增長曲線非常小。使用 show dom usage 檢視,曲線基本持平。

使用 任務管理器進行檢視,發現記憶體可以回落。 sieve 比 drip 要準確。

下圖是 sieve 的兩個曲線圖:

效果還是不錯的。

jquery1.7.2 在 ie8 下與 frameset 有嚴重的記憶體洩露。

這只是在單頁面裡進行測試,沒有問題。在 frameset 裡,測試,重新整理一下子頁面,或切換左邊的選單,都會引起記憶體洩露。

環境 jquery 1.7.2, ie8 , 使用 frameset。 

現象是重新整理子頁面所有元素都洩露。包括 最外層的 frameset。

經排查, 改為 jquery 1.7.1 ,問題解決。 

記憶體洩露檢測

c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...

檢測記憶體洩露

程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...

記憶體洩露檢測

1 包含標頭檔案 include include 2 每個cpp檔案包含 static char this file file define new new normal block,this file,line 3 設定標誌 int tmpdbgflag tmpdbgflag crtsetdbgf...