更新:我在一年前发布了这个问题,有趣的是,我在一个主要是IE7的项目中遇到了同样的问题。基本上我在WinXP SP3虚拟PC中安装了IE7,并且下面的代码会发生内存泄漏。基本上我不希望代码泄漏我下面提供的示例代码,任何帮助将不胜感激
我最近在看这个内存泄漏工具sIEve:http://home.orange.nl/jsrosman/
所以我决定通过创建一个打开弹出窗口的主页来测试该工具。 我开始创建3个页面:index.html,page1.html和page2.html,index.html页面将打开一个链接到page1.html的子窗口(弹出窗口)。 Page1将有一个链接到page2.html的锚标记,而page2将有一个链接回page1.html
问题
所以在我输入index.html页面的工具中,弹出窗口打开到page1.html,然后我点击了page2链接,没有检测到泄漏。
当我在第2页时,我点击链接返回第1页,这就是工具声称有链接的地方。泄漏似乎发生在index.html页面上,我不知道为什么会这样做。更令人担忧的是,我可以看到工具检测到的元素甚至不在我的页面上。
有没有人有使用此工具的经验或知道这是否真的是内存泄漏? 任何展示如何在没有内存泄漏的情况下实现我正在做的事情的样本?
INDEX.HTML
<script type="text/javascript">
MYLEAK = function() {
var childWindow = null;
function showWindow() {
childWindow = window.open("page1.html", "myWindow");
return false;
}
return {
init: function() {
$("#window-link").bind("click", showWindow);
}
}
}();
</script>
</head>
<body>
<a id="window-link" href="#" on>Open Window</a>
<script type="text/javascript">
$(document).ready(function() {
MYLEAK.init();
});
</script>
</body>
</html>
PAGE1.HTML
<html>
<body>
<h1>Page 1</h1>
<a href="page2.html">Page2</a>
</body>
</html>
PAGE2.HTML
<html>
<body>
<h1>Page 2</h1>
<a href="page1.html">Page1</a>
</body>
</html>
感谢您的努力。
答案 0 :(得分:1)
我已经在Windows 2000 5.00.2195 Service Pack 4上测试了这个漏洞,其中包含IE的以下规范
version: 6.0.2800.1106IS
Chiper Strength : 128-bit
Product ID 55736-837-5565635-04173
Updated Versions:;SP1;Q823353;Q833989
保持对新打开的窗口的引用,并在关闭它时(或 重新打开它),将引用设置为null。那样的垃圾收集器 将收集(最终)窗口对象。如果你不这样,窗口 对象留在内存中,没有人知道它什么时候会被删除。
此外,你应该总是命名你的窗户(但没有任何东西 处理你的问题。)
类似的东西:
var wPopUp = null;
function clickButton()
{
if ( wPopUp )
{
if ( !wPopUp.closed )
{
wPopUp.close();
}
wPopUp = null;
}
wPopUp = window.open('leak2.html',
'wPopUp', 'width=500, height=400');
}
由于IE无法完成其工作并收回周期,因此我们无需这样做。如果我们明确地打破循环,那么IE将能够回收内存。根据微软的说法,闭包是造成内存泄漏的原因。这当然是非常错误的,但它导致微软向程序员提供了关于如何应对微软错误的非常糟糕的建议。事实证明,很容易打破DOM端的循环。几乎不可能在JScript端打破它们。
当我们完成一个元素时,我们必须将其所有事件处理程序置空以打破周期。我们所要做的就是为每个事件处理程序的属性赋值null。这可以非常具体地完成,或者我们可以进行通用的清除功能。