我注意到,在我的应用程序中,与每个页面刷新的Win7上的IE进程相关联的内存增加了20-30 MB。一旦达到约1.5 GB,浏览器就会无法响应。我正在使用IE9,并且只能在IE9中重现这一点。在Chrome,FF,IE7或IE8中没有此类问题。实际上,在兼容模式下运行IE9时也不会出现此问题。
特别是,我想知道即使页面刷新后内存也会泄漏。有没有人见过这个?
答案 0 :(得分:6)
我不确定这是否是你的问题,但我也遇到了IE9内存泄漏问题,内存不断增长和增长(每次刷新/页面更改大约20mgs)。
如果您正在使用Modernizr(现在应该在最近的一个版本中修复,我相信2.5+),但如果您使用的是旧版本(并且不能因任何原因更新它),那么所有你需要做的是替换一个return
语句。
Modernizr / Geolocation& IE9 ,它实际上是IE9的继承问题,而不是Modernizr。
return 'geolocation' in navigator
而不是:
return !!navigator.geolocation // this causes the memory leak (silly IE9)
https://github.com/Modernizr/Modernizr/issues/513
看看那个链接,但基本上需要更改Geolocation测试的return语句,这个问题会自行解决!
答案 1 :(得分:3)
过去,Internet Explorer在常见的JavaScript变量和DOM对象之间存在一些问题。所以,如果我没记错的话,就像这样的循环引用
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
即使没有其他对e
和x
的引用,也不会被垃圾回收。这是因为IE使用了不同的DOM元素和JavaScript垃圾收集方法。
现在,我相信这个问题已经在更高版本的IE中得到了解决,但也许并非如此。尝试找到所有这些有问题的引用,如果你不再需要它们,请手动删除它们。
e.jsReference = null;
x.elementReference = null;
编辑:在IE 8中测试
我写了这个简单的测试网页。
<html>
<head>
<title>Leak test</title>
<script>
function leak() {
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
}
function test() {
for (var i = 0; i < 10000; i++)
leak();
alert('Done');
}
</script>
</head>
<body>
<input type="button" value="test" onclick="test();" />
</body>
</html>
我在IE 8中测试了这个,因为我没有在这台机器上安装IE 9。但是,这仍然可能是相关的,因为它表明即使在IE的最新版本中问题仍然存在,因此它甚至可能在IE 9中持续存在。
我打开了页面并观看了内存使用情况。每次按下按钮后,内存使用量增加几MB。刷新网页后,绝对没有任何反应。关闭IE后,内存使用量恢复到原始状态。
您可以在IE 9中自行尝试。当然,您可能没有在代码中分配10000个循环引用对象,但您可能会创建更大的对象,这些对象可能包含您尚未找到的某些循环引用。 / p>