我注意到,在我的应用程序中,与 Win7 上的 IE 进程相关的内存在每次页面刷新时都会增加 20-30 MB。一旦我达到大约 1.5 GB,浏览器就会变得无响应。我使用的是 IE9,只能在 IE9 中重现。Chrome、FF、IE7 或 IE8 中没有此类问题。事实上,在兼容模式下运行 IE9 时也不会出现该问题。
特别是,我想知道即使在页面刷新后内存如何泄漏。有没有其他人看过这个?
我注意到,在我的应用程序中,与 Win7 上的 IE 进程相关的内存在每次页面刷新时都会增加 20-30 MB。一旦我达到大约 1.5 GB,浏览器就会变得无响应。我使用的是 IE9,只能在 IE9 中重现。Chrome、FF、IE7 或 IE8 中没有此类问题。事实上,在兼容模式下运行 IE9 时也不会出现该问题。
特别是,我想知道即使在页面刷新后内存如何泄漏。有没有其他人看过这个?
我不确定这是否是您的问题,但我也遇到了这个 IE9 内存泄漏问题,其中内存不断增长(每次刷新/页面更改大约 20 毫克)。
如果您使用的是 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 测试的返回语句需要更改,这个问题会自行解决!
过去,Internet Explorer 在普通 JavaScript 变量和 DOM 对象之间的引用方面存在一些问题。所以,如果我没记错的话,像这样的循环引用
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
即使没有其他对e
and的引用,也不会被垃圾收集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 个循环引用对象,但您可能会创建更大的对象,其中可能包含一些您尚未找到的循环引用。