IE 6 中存在内存泄漏的大型 Web 应用程序
-
09-06-2019 - |
题
我有一个巨大的网络应用程序在 IE 6 中存在内存泄漏问题。
修复演示该问题的 5 行代码示例中的内存泄漏很容易。
但如果我有一个非常庞大的应用程序,应该从哪里开始呢?
解决方案
查看 滴. 。这通常可以消除 IE 内存泄漏的猜测。
如果由于某种原因 Drip 没有找到它,请仔细查看任何处理事件的 JavaScript 代码。这几乎总是浏览器中任何重大内存泄漏的根源。
销毁带有附加处理程序的 DOM 元素而不首先删除这些处理程序将阻止恢复与这些处理程序关联的内存。
其他提示
该应用程序是否使用大量 JavaScript?
如果确实如此,那么我发现有助于避免内存泄漏的一件事是确保您使用的是 Prototype 或 jQuery 等 JavaScript 框架,因为他们已经尝试并测试了不会泄漏内存的事件处理代码。
- 如果您有,IE6 也可能泄漏内存 对 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]-->
您可能需要删除所有“调试器”;陈述如果您不想处理某些偶尔的例外。
Java 函数内存泄漏?
这是一个解决方案:把你的自制java扔掉。使用标准 JavaScript 框架之一,例如 jQuery。
如果您正在编写复杂的 JavaScript 并且不是 Java 专家,请不要自己动手。
编辑:什么,这是个坏建议吗?Javascript 不仅仅是一种简单的脚本语言;它是一种复杂且强大的编程语言,与 HTML DOM 紧密相连,在不同的浏览器中实现方式不同。如果你做错了,你不仅会泄漏内存,还会到处抛出错误,通常会使浏览体验变得很糟糕。您想赶走访问您网站的人吗?不?然后使用 JavaScript 框架并摆脱所有跨浏览器的胡言乱语。