非同步**,解析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) ;使用 drip,進行測試,使用 show memory usage 檢視,記憶體增加非常小,使用 show dom usage 檢視,曲線還是很明顯(但點show dom leaks,頁面會變白)html = html[1].replace(/]*)\/>/ig, "") ;
var div = document.createelement("div");
div.innerhtml = "div" + html +"
";html =$(div.lastchild.childnodes);
... document.body.removechild(div);
使用 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...