javascript简单对象创建测试:opera漏洞?

时间:2010-04-02 21:00:28

标签: javascript

我试图在一些浏览器中找出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与众不同。即使禁用了内存缓存,内存也仅在窗口关闭时回收,而不是在导航卸载时回收。去图。

2 个答案:

答案 0 :(得分:1)

在Windows上的Opera 10.5上运行正常。这里没有泄漏。

答案 1 :(得分:1)

我真的不知道,但也许这与此有关。 http://www.opera.com/support/kb/view/827/

Opera的疯狂快退按钮必须做点什么。我注意到它感觉有点不同,因为他们发布10.5(有些页面感觉更慢......也许他们调整了它),所以也许这就是为什么有些人说他们无法重现内存泄漏。