JavaScript内存泄漏

7
我有一些 Javascript(与 Google 地图 API 一起使用),我正在 IE 和 Chrome 上进行测试,并注意到 IE 中出现了内存泄漏症状:当我连续刷新页面时,IE 中使用的内存量保持增长(快速增长),但在 Chrome 中保持不变。不需要发布所有的代码(因为它相当长),我可以得到一些建议要注意什么?是什么导致在 IE 上刷新页面时内存不断增长?如我所说,没有代码很难,但我想看看是否有任何通用建议可行。谢谢。
更新:感谢迄今为止的回答。作为一个理智的检查,我运行了谷歌地图 api 的 "Hello World" 代码 from google,以查看在 IE 中会发生什么(该代码显示如下)。当我在 IE 中反复刷新页面时,内存不断增长。这是内存泄漏吗?这似乎不是预期功能...
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
  function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  }

</script>
</head>
<body onload="initialize()">
  <div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>
更新2:那么在IE中没有办法运行这个谷歌Hello World地图API代码而不泄漏内存吗?我注意到如果我在maps.google.com上运行相同的实验,似乎就没有泄漏...如果有人能帮我修改这个Hello World代码,使其在IE中不会泄漏,那就太好了;这样我就可以在此基础上构建(如果使用JQuery有帮助,我不介意,但我已经在Hello World代码上尝试过了,在IE中仍然泄漏)。再次感谢。

1
IE 6存在一个非常特定的泄漏问题,如果您没有将动态创建和销毁的HTML元素上的所有事件处理程序(onclick、onmousever、onload)置空,那么这些引用将永远不会被垃圾回收。这在后来的版本中得到了修复。因此,如果您在IE6中遇到了这个问题,那很可能是您的问题(尽管Google的代码应该高于此问题)。请记住,浏览器会在感觉到需要时运行其垃圾回收器,而几乎永远不会在您期望的时候运行。如果等待,内存使用量会下降吗? - Andrew
我实际上正在使用IE 7,当等待时内存不会下降...当我仅将其附加到<body>时,如何“null out all the event handlers”? - hhj
1
如果您使用的是IE 7,则此问题不应影响您。以前的问题是,如果您有任何元素与事件相关联(如果地图具有拖放功能,则会出现此问题)-您必须循环遍历所有具有事件处理程序的元素并说document.getElementById('mydiv').onclick=null;等等。但您完全正确。在上面的代码中,我没有看到您做错了什么。这一定是Google代码的问题-我可能能给出的最糟糕的答案。 - Andrew
4个回答

7

更新:

我使用drip.exe测试了上面的代码,似乎确实存在内存泄漏。当自动刷新代码运行几分钟时,内存使用量稳步增加。

更新 2:

我认为这是一个 bug:http://code.google.com/p/gmaps-api-issues/issues/detail?id=1555&can=1&q=unload&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Internal%20Stars


你认为链接的gmaps API问题是问题的原因吗?它似乎与IE内存泄漏没有太大关系。我们在IE7中遇到了同样的问题,这似乎是该浏览器的一个致命问题... - matao
@matao 使用drip进行的测试非常有意义。 - powtac
@matao,正如我在更新部分所说的那样,drip显示在刷新时mem消耗增加了,由于除了g maps之外没有其他代码,因此泄漏必须出现在那里。我相信与此同时,这个问题已经被g解决了,或者根据文档建议使用Andrew的建议:onunload="GUnload()" - powtac
啊,是的,这就是我们遇到的相同问题,内存使用似乎会在每次刷新包含谷歌地图的页面时增加约10MB,即使是简单的示例也是如此。这是在IE7中使用最新的v3版本,所以我认为他们只是把它放在了太难的篮子里。我们向客户推荐定期重新启动浏览器,或者使用Firefox :-( - matao
我们正在使用API的v3版本,我以为GUnload在v3中已经被弃用了?但我们还是会尝试一下,为什么不呢?只是出于好奇,因为在Google地图主页上观察到了相同的行为,如果那里没有解决,我们的机会就不大了... - matao

1

IE记忆泄漏的一个众所周知的来源是在DOM元素上绑定的闭包(函数)作为事件处理程序时意外或故意地捕获了Javascript“东西”。大多数框架都会尝试明确地清除事件处理程序以消除此问题。


1

在离开页面之前,您还需要执行GUnload。只需添加一个“unload”事件:

<body onload="initialize()" onunload="GUnload()">

了解更多关于Google Maps API的泄漏信息


2
我正在使用API v3。不过还是谢谢你的建议。 - hhj

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接