【问题标题】:javascript memory leakjavascript内存泄漏
【发布时间】:2011-02-28 16:15:31
【问题描述】:

我有一些 javascript(与 google maps api 一起使用),我正在 IE 和 Chrome 上进行测试,发现仅在 IE 中出现内存泄漏症状:当我不断刷新页面时,IE 中使用的内存量不断增长(快速),但在 Chrome 中它保持不变。如果不发布所有代码(因为它相当长),我可以获得一些关于要注意什么的建议吗?什么会导致 IE 页面刷新时内存一直这样增长?

就像我说的,我知道没有代码很难,但我想先看看是否有任何通用建议有效。谢谢。

更新:感谢到目前为止的回复。作为健全性检查,我运行了 google maps 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:那么有没有办法让这个 google Hello World 地图 api 代码在不泄漏 IE 内存的情况下运行?我注意到如果我在maps.google.com 上运行相同的实验,似乎没有泄漏......如果有人可以帮助我修改 hello world 代码以使其不会在 IE 中泄漏,那就太好了;这样我就可以构建它(如果这会有所帮助,我不介意使用 JQuery,但我在 Hello World 代码上尝试了它,它仍然在 IE 中泄漏)。再次感谢

【问题讨论】:

  • IE 6 有一个非常具体的泄漏问题,如果您没有将您正在动态创建和销毁的 HTML 元素上的所有事件处理程序(onclick、onmousever、onload)清空,那么这些引用将永远不会得到垃圾收集。这在以后的版本中得到了修复。因此,如果您在 IE6 中遇到此问题,则可能是您的问题(尽管 Google 的代码应该在此问题之上)。请记住,浏览器会在需要时运行其垃圾收集器,而几乎不会在您期望的时候运行。如果您等待,内存使用量会下降吗?
  • 我实际上使用的是 IE 7,等待时内存不会下降......当我只是将它附加到 时,我将如何“取消所有事件处理程序”?跨度>
  • 如果您使用的是 IE 7,这个问题应该不会影响您。之前的问题是,如果您有任何与它们相关联的事件的元素(如果地图具有拖放功能,那么它就有)——您必须遍历所有具有事件处理程序的元素并说 @ 987654324@ 等。但你是完全正确的。在您上面的代码的情况下,我可以看到您所做的并没有错。这一定是谷歌代码的问题——我能给出的最糟糕的答案。

标签: javascript internet-explorer memory-leaks


【解决方案1】:

更新:

我用drip.exe 测试了上面的代码,似乎确实存在内存泄漏之类的问题。使用自动刷新运行代码几分钟后,内存使用量稳步上升。

更新 2:

我认为这是错误: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 表明刷新时内存消耗增加了,因为除了 g 映射之外没有其他代码,泄漏必须在某个地方。我确信同时这个问题已经被 g 解决了,或者应该使用 Andrew 根据文档的建议:onunload="GUnload()"
  • 啊,是的,这与我们遇到的问题相同,每次刷新包含 g 映射的页面时,内存使用量似乎会增加约 10MB,即使是简单的示例也是如此。这是 IE7 中最新的 v3,所以我认为他们只是把它留在了太难的篮子里。我们对客户端的建议是定期重启浏览器,或者使用 Firefox :-(
  • 我们正在使用 v3 的 api,我认为 GUnload 已被 v3 弃用?但我们会试一试,为什么不呢?只是好奇,因为在谷歌地图主页上观察到相同的行为,如果在那里没有解决,我不喜欢我们的机会......
【解决方案2】:

IE 内存泄漏的一个众所周知的来源是(有意或无意地)将 Javascript“东西”捕获在作为事件处理程序绑定到 DOM 元素的闭包(函数)中。出于这个原因,大多数框架都努力明确地清除事件处理程序。

【讨论】:

    【解决方案3】:

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

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

    Google Maps API 上阅读有关此泄漏的更多信息

    【讨论】:

    • 我正在使用 api v3。不过感谢您的建议。
    【解决方案4】:

    到目前为止,大多数答案都将帮助您到达那里,因此我添加了一篇文章的链接,该链接指向 IBM Dev Works for JavaScript 中的内存泄漏模式(您可能会发现它很有帮助)

    http://www.ibm.com/developerworks/web/library/wa-memleak/

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2014-04-08
      • 2013-03-29
      • 2013-07-12
      相关资源
      最近更新 更多