我有一個是具有IE 6巨大Web應用程序利用內存泄漏IE 6
與內存泄漏問題演示該問題有5行代碼示例中的固定內存泄漏一個巨大的網絡應用程序是容易的。
但是,如果我有一個非常龐大的應用程序,應該從哪裏開始?
我有一個是具有IE 6巨大Web應用程序利用內存泄漏IE 6
與內存泄漏問題演示該問題有5行代碼示例中的固定內存泄漏一個巨大的網絡應用程序是容易的。
但是,如果我有一個非常龐大的應用程序,應該從哪裏開始?
退房Drip。這通常需要IE內存泄漏的猜測。
如果由於某種原因,Drip沒有找到它,請仔細查看任何適用於事件的JavaScript代碼。這幾乎總是瀏覽器中任何重大內存泄漏的來源。
銷燬附有處理程序的DOM元素時,如果不先移除這些處理程序,將會阻止恢復與這些處理程序關聯的內存。
該應用程序是否使用了很多JavaScript?
如果確實如此,那麼我發現有助於避免內存泄漏的一件事是確保您使用的是諸如Prototype或jQuery之類的JavaScript框架,因爲他們已經嘗試並測試了事件處理代碼, t泄漏內存。
你從Java功能的內存泄露?
下面是一個解決方案:把你的自制Java和查克它。使用標準的JavaScript框架之一,如jQuery。
如果你正在做複雜的JavaScript,而不是Java的大師,不要自己動手。
編輯:什麼,那是不好的建議? Javascript不僅僅是一種簡單的腳本語言,它是一種複雜且令人驚訝的功能強大的編程語言,它與HTML DOM密切相關,在不同的瀏覽器中執行該語言的方式不同。如果你做錯了,你不僅會泄漏內存,還會在各處發現錯誤,並且通常會使瀏覽體驗變得糟糕透頂。你想趕走進入你的網站的人嗎?沒有?然後使用JavaScript框架,並擺脫所有你的黑客跨瀏覽器廢話。
這裏是我如何解決IE7中的內存泄漏問題。我們的想法是在卸載頁面時將所有DOM節點上的所有expando屬性設置爲null。這對我有效。你可能會覺得它很有用。
<!--[if lt IE 8]>
<script type="text/javascript">
function disposeAll() {
if (window.document.all) {
for (var index = 0; index < window.document.all.length; index++) {
try { dispose(window.document.all[index], []); } catch (e) { debugger; }
}
}
dispose(window.document.body, []);
dispose(window.document, []);
dispose(window, []);
window.disposeAll = null;
window.dispose = null;
window.onunload = null;
}
function dispose(something, map) {
if (something == null) return;
if (something.dispose && typeof (something.dispose) == 'function') {
try { something.dispose(); } catch (e) { debugger; }
}
map.push(something);
for (var key in something) {
var value = null;
try { value = something[key]; } catch (e) { };
if (value == null || value == dispose || value == disposeAll) continue;
var processed = null;
for (var index = 0; index < map.length; index++) {
if (map[index] === value) {
processed = value;
break;
}
}
if (processed != null) continue;
var constructor = value.constructor;
if (constructor == Object || constructor == Array) {
try { dispose(value, map); } catch (e) { debugger; }
}
if (constructor == Object || constructor == Array || constructor == Function) {
try { something[key] = null; } catch (e) { debugger; }
}
}
map.pop();
}
(function() {
var previousUnloadHandler = window.onunload;
if (previousUnloadHandler == null) {
window.onunload = disposeAll;
} else {
window.onunload = function() {
previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
disposeAll();
previousUnloadHandler = null;
};
}
}());
</script>
<![endif]-->
您可能希望刪除所有「調試器」如果你不想處理某些偶然的例外情況,那麼聲明。
我沒有模仿你,但jQuery本身在一些情況下還有內存泄漏,還有jQuery UI。至少在1.3.2版本中... – rball 2009-05-12 22:40:59