javascript内存泄漏

javascript内存泄漏,javascript,internet-explorer,memory-leaks,Javascript,Internet Explorer,Memory Leaks,我在IE和Chrome上测试了一些javascript(与google maps api一起使用),并注意到IE中存在内存泄漏症状:当我不断刷新页面时,IE中使用的内存量不断增长(快速),但在Chrome中保持不变。在不发布所有代码的情况下(因为代码相当长),我可以得到一些关于注意什么的建议吗?是什么导致IE页面刷新中的内存持续增长 就像我说的,我知道没有代码是很难的,但我想先看看有没有通用的建议。谢谢 更新:感谢您迄今为止的回复。作为一个合理性检查,我运行了谷歌地图api“Hello Worl

我在IE和Chrome上测试了一些javascript(与google maps api一起使用),并注意到IE中存在内存泄漏症状:当我不断刷新页面时,IE中使用的内存量不断增长(快速),但在Chrome中保持不变。在不发布所有代码的情况下(因为代码相当长),我可以得到一些关于注意什么的建议吗?是什么导致IE页面刷新中的内存持续增长

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

更新:感谢您迄今为止的回复。作为一个合理性检查,我运行了谷歌地图api“Hello World”代码,以查看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>

函数初始化(){
var latlng=新的google.maps.latlng(-34.397150.644);
变量myOptions={
缩放:8,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
var map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
}
更新2:那么,没有办法让这个google Hello World map api代码在IE中运行而不泄漏内存吗?我注意到,如果我在上运行相同的实验,似乎没有泄漏……如果有人能帮助我修改hello world代码,使其不会在IE中泄漏,那就太好了;通过这种方式,我可以在它的基础上进行构建(如果这有帮助的话,我不介意使用JQuery,但我在Hello World代码中尝试了它,但它仍然在IE中泄漏)。再次感谢

  • 用于测试您的代码它为您的代码中可能存在的问题提供了很好的建议
  • 还有一个!(它移到了这里,其他的下载和关于滴水工具的描述:)
  • 还有一个问题
  • jQuery有一些内置机制来避免内存泄漏。有很多关于这个问题的文献
  • 提醒:谷歌宣布将放弃对IE6的支持
  • (2013年7月更新)
更新:

我对上面的代码进行了测试,似乎确实存在类似内存泄漏的问题。在运行自动刷新代码几分钟的过程中,内存使用率稳步上升

更新2:


我认为这就是问题所在:

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

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



请在

上阅读有关此漏洞的更多信息,目前为止的大多数答案都将帮助您实现这一点,因此我添加了一个链接,指向一篇关于IBM Dev Works for JavaScript内存泄漏模式的文章(您可能会发现它很有帮助)


IE 6有一个非常具体的泄漏问题,如果您没有动态创建和销毁HTML元素上的所有事件处理程序(onclick、onmousever、onload)都为空,这些引用将永远不会被垃圾收集。这在以后的版本中已修复。所以,如果你在IE6中遇到这种情况,那很可能是你的问题(尽管谷歌的代码应该在这个问题之上)。请记住,浏览器会在它喜欢的时候运行它的垃圾收集器,而在您期望的时候几乎不会。如果您等待,内存使用会下降吗?我实际上使用的是IE 7,而在等待时内存不会下降…当我简单地将其附加到时,如何“清空所有事件处理程序”?如果您使用的是IE 7,这个问题不应该影响您。以前的问题是,如果您有任何元素与事件关联(如果映射具有拖放功能,那么它就有了)——您必须遍历所有具有事件处理程序的元素,并说
document.getElementById('mydiv')。onclick=null等等,但你完全正确。在上面的代码中,我看不出您所做的任何错误。这一定是谷歌代码的问题——这是我能给出的最糟糕的答案。我使用的是api v3。谢谢你的建议。是什么让你相信相关的GMAPSAPI问题才是问题所在?这似乎与IE内存泄漏没有多大关系。我们在IE7中遇到了同样的问题,它似乎是该浏览器的一个障碍…@matao滴水测试非常简单meaningful@matao,正如我在更新部分中所说的,drip显示在刷新时mem消耗量增加了,因为除了g映射之外没有其他代码,所以泄漏一定在那里的某个地方。我敢肯定,在这期间,g解决了这个问题,或者应该使用Andrew根据文档提出的建议:
onunload=“GUnload()”
ah,是的,这与我们遇到的问题相同,内存使用似乎随着包含g映射的页面的每次刷新而增加~10MB,即使是简单的示例。这是IE7中最新的v3版本,所以我认为他们只是把它放在了一个太硬的篮子里。我们对客户端的建议是定期重新启动浏览器,或者使用Firefox:-(我们使用的是api的v3,我认为GUnload不适合v3?但我们会尝试一下,为什么不呢?奇怪的是,谷歌地图主页上也观察到了同样的行为,如果没有解决,我不喜欢我们的机会。。。
<body onload="initialize()" onunload="GUnload()">