2008-08-21 35 views

回答

7

退房Drip。这通常需要IE内存泄漏的猜测。

如果由于某种原因,Drip没有找到它,请仔细查看任何适用于事件的JavaScript代码。这几乎总是浏览器中任何重大内存泄漏的来源。

销毁附有处理程序的DOM元素时,如果不先移除这些处理程序,将会阻止恢复与这些处理程序关联的内存。

1

该应用程序是否使用了很多JavaScript?

如果确实如此,那么我发现有助于避免内存泄漏的一件事是确保您使用的是诸如Prototype或jQuery之类的JavaScript框架,因为他们已经尝试并测试了事件处理代码, t泄漏内存。

-3

你从Java功能的内存泄露?

下面是一个解决方案:把你的自制Java和查克它。使用标准的JavaScript框架之一,如jQuery。

如果你正在做复杂的JavaScript,而不是Java的大师,不要自己动手。

编辑:什么,那是不好的建议? Javascript不仅仅是一种简单的脚本语言,它是一种复杂且令人惊讶的功能强大的编程语言,它与HTML DOM密切相关,在不同的浏览器中执行该语言的方式不同。如果你做错了,你不仅会泄漏内存,还会在各处发现错误,并且通常会使浏览体验变得糟糕透顶。你想赶走进入你的网站的人吗?没有?然后使用JavaScript框架,并摆脱所有你的黑客跨浏览器废话。

+0

我没有模仿你,但jQuery本身在一些情况下还有内存泄漏,还有jQuery UI。至少在1.3.2版本中... – rball 2009-05-12 22:40:59

0

这里是我如何解决IE7中的内存泄漏问题。我们的想法是在卸载页面时将所有DOM节点上的所有expando属性设置为null。这对我有效。你可能会觉得它很有用。

<!--[if lt IE 8]> 
<script type="text/javascript"> 

function disposeAll() { 
    if (window.document.all) { 
     for (var index = 0; index < window.document.all.length; index++) { 
      try { dispose(window.document.all[index], []); } catch (e) { debugger; } 
     } 
    } 
    dispose(window.document.body, []); 
    dispose(window.document, []); 
    dispose(window, []); 
    window.disposeAll = null; 
    window.dispose = null; 
    window.onunload = null; 
} 

function dispose(something, map) { 
    if (something == null) return; 
    if (something.dispose && typeof (something.dispose) == 'function') { 
     try { something.dispose(); } catch (e) { debugger; } 
    } 
    map.push(something); 
    for (var key in something) { 
     var value = null; 
     try { value = something[key]; } catch (e) { }; 
     if (value == null || value == dispose || value == disposeAll) continue; 

     var processed = null; 
     for (var index = 0; index < map.length; index++) { 
      if (map[index] === value) { 
       processed = value; 
       break; 
      } 
     } 
     if (processed != null) continue; 
     var constructor = value.constructor; 
     if (constructor == Object || constructor == Array) { 
      try { dispose(value, map); } catch (e) { debugger; } 
     } 
     if (constructor == Object || constructor == Array || constructor == Function) { 
      try { something[key] = null; } catch (e) { debugger; } 
     } 
    } 
    map.pop(); 
} 

(function() { 
    var previousUnloadHandler = window.onunload; 
    if (previousUnloadHandler == null) { 
     window.onunload = disposeAll; 
    } else { 
     window.onunload = function() { 
      previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED 
      disposeAll(); 
      previousUnloadHandler = null; 
     }; 
    } 
}()); 

</script> 
<![endif]--> 

您可能希望删除所有“调试器”如果你不想处理某些偶然的例外情况,那么声明。