我试图在一些浏览器中找出javascript中的某些内存泄漏情况。目前我只测试FF 3.6,Opera 10.10和Safari 4.0.3。我从一个相当简单的测试开始,并且可以确认Firefox和Safari中没有内存泄漏。但Opera只是记忆而不是回馈它。是什么赋予了?这是测试:
<html>
<head>
<script type="text/javascript">
window.onload = init;
//window.onunload = cleanup;
var a=[];
function init() {
var d = document.createElement('div');
d.innerHTML = "page loading...";
document.body.appendChild(d);
for (var i=0; i<400000; i++) {
a[i] = new Obj("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
}
d.innerHTML = "PAGE LOADED";
}
function cleanup() {
for (var i=0; i<400000; i++) {
a[i] = null;
}
}
function Obj(msg) {
this.msg=msg;
}
</script>
</head>
<body>
</body>
</html>
我不应该在window.unload上调用cleanup(),但也尝试了。没运气。正如您所看到的,这是简单的JS,没有循环DOM链接,没有闭包。我在Mac 10.4.11上使用“top”监视内存使用情况。正如预期的那样,内存使用量会在页面加载时激增。在FF和Safari重新加载页面时不使用任何进一步的内存,并且当窗口(选项卡)关闭时返回所有内存。在Opera中,内存在加载时出现峰值,并且在每次重新加载时似乎也会进一步加剧(但并非总是......)。但无论重新加载,内存都不会低于初始负载峰值。
我曾希望这是一个所有浏览器都能通过的简单测试,因此我可以继续进行更“有趣”的测试。我在这里做错了吗?或者这是一个已知的Opera问题?
谢谢! -Joe
<小时/> 更新
根据支持文档,我尝试在我的JS中设置opera.setOverrideHistoryNavigationMode ='compatible',但它没有改变任何东西。据我所知,这个方法优先于任何opera:config设置等。
但是,我倾向于同意这里有一些Opera优化。我不是Opera的用户,所以我只是熟悉这个测试的所有配置内容......
我关闭了此测试的Opera用户首选项中的所有内存缓存。这很有效。关闭窗口时回收了内存。所以它不能是泄密。
我注意到的另一件事: 在Firefox和Safari中,很可能在其他浏览器中,如果没有window.onunload处理程序,则仅在窗口关闭时回收内存。如果用户在其他地方导航,则不会回收内存。因此,如果你加载一个充满JS对象的大页面,然后花一天时间浏览纯HTML页面,你就不会长时间回忆内存。
但是,如果你包含一个简单的“无所事事”window.onunload处理程序,如: window.onunload =虚设; function dummy(){} 然后即使在远离页面的导航中也会回收内存。从我在这个问题上所读到的一点点来看,这似乎是已知的,理想的行为。
Opera与众不同。即使禁用了内存缓存,内存也仅在窗口关闭时回收,而不是在导航卸载时回收。去图。
答案 0 :(得分:1)
在Windows上的Opera 10.5上运行正常。这里没有泄漏。
答案 1 :(得分:1)
我真的不知道,但也许这与此有关。 http://www.opera.com/support/kb/view/827/
Opera的疯狂快退按钮必须做点什么。我注意到它感觉有点不同,因为他们发布10.5(有些页面感觉更慢......也许他们调整了它),所以也许这就是为什么有些人说他们无法重现内存泄漏。