Ray*_*lus 6 javascript internet-explorer-9
我注意到,在我的应用程序中,与每个页面刷新的Win7上的IE进程相关的内存增加了20-30 MB.一旦达到约1.5 GB,浏览器就会无法响应.我正在使用IE9,并且只能在IE9中重现这一点.在Chrome,FF,IE7或IE8中没有此类问题.实际上,在兼容模式下运行IE9时也不会出现此问题.
特别是,我想知道即使页面刷新后内存也会泄漏.有没有人见过这个?
我不确定这是否是你的问题,但我也得到了IE9内存泄漏问题,内存不断增长和增长(每次刷新/页面更改大约20mgs).
如果您正在使用Modernizr(现在应该在最近的一个版本中修复,我相信2.5+),但是如果您使用的是旧版本(并且不能因任何原因更新它)那么您需要的所有内容do是替换一个return语句.
现代问题出现在Modernizr/Geolocation和IE9上,它实际上是IE9的继承问题,而不是Modernizr.
return 'geolocation' in navigator
Run Code Online (Sandbox Code Playgroud)
代替:
return !!navigator.geolocation // this causes the memory leak (silly IE9)
Run Code Online (Sandbox Code Playgroud)
https://github.com/Modernizr/Modernizr/issues/513
看看那个链接,但基本上Geolocation测试的return语句需要改变,这个问题将自行解决!
过去,Internet Explorer 在普通 JavaScript 变量和 DOM 对象之间的引用方面存在一些问题。所以,如果我没记错的话,像这样的循环引用
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
Run Code Online (Sandbox Code Playgroud)
即使没有其他对e和 的引用,也不会被垃圾收集x。这是因为 IE 对 DOM 元素和 JavaScript 使用了不同的垃圾收集方法。
现在,我相信这个问题已经在更高版本的 IE 中得到解决,但也许事实并非如此。尝试找到所有此类有问题的引用,如果不再需要它们,请手动删除它们。
e.jsReference = null;
x.elementReference = null;
Run Code Online (Sandbox Code Playgroud)
编辑:在 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>
Run Code Online (Sandbox Code Playgroud)
我在 IE 8 中测试了这一点,因为我在这台机器上没有安装 IE 9。然而,这仍然可能是相关的,因为它表明即使在最新版本的 IE 中该问题仍然存在,因此即使在 IE 9 中它也可能持续存在。
我打开页面并观察内存使用情况。每按一次按钮,内存使用量就会增加几 MB。刷新网页后,完全没有任何反应。关闭IE后,内存使用恢复到原来的状态。
您可以在 IE 9 中亲自尝试一下。当然,您可能不会在代码中分配 10000 个循环引用对象,但您可能会创建更大的对象,其中可能包含一些您尚未找到的循环引用。
| 归档时间: |
|
| 查看次数: |
4122 次 |
| 最近记录: |