如何销毁JavaScript对象?

问题描述 投票:66回答:5

最近,我遇到了我的一个应用程序,它消耗了太多的内存并增加了10 MB /秒。

因此,我想知道破坏JavaScript对象和变量的最佳方法,以便内存消耗保持不变,我的FF无法被破坏。

我在每8秒间隔调用两个JavaScript而不重新加载页面。

function refresh() {
    $('#table_info').remove();
    $('#table').hide();
    if (refreshTimer) {
        clearTimeout(refreshTimer);
        refreshTimer = null ;
    }
    document.getElementById('refresh_topology').disabled=true; 
    $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123"));
    $("#topo").hide();
    $('#root').remove();
    show_topology();
}

如何查看哪个变量导致内存开销和方法停止执行该进程?

javascript object destroy
5个回答
79
投票

您可以将所有代码放在一个名称空间下,如下所示:

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

使用delete关键字将删除对该属性的引用,但在较低级别,JavaScript垃圾收集器(GC)将获取有关要回收哪些对象的更多信息。

您还可以使用Chrome开发者工具获取应用的内存配置文件,以及应用中的哪些对象需要按比例缩小。


30
投票

您无法删除对象,当没有对象的引用时,它们将被删除。您可以使用delete删除引用。

但是,如果您在对象中创建了循环引用,则可能需要解除某些内容。


24
投票

虽然现有的答案已经给出了解决问题的解决方案和问题的后半部分,但它们没有提供问题的前半部分的自我发现方面的答案:“我怎样才能看出哪个变量导致内存开销......?“

它可能不像3年前那么强大,但Chrome Devevloper Tools“Profiles”部分现在非常强大且功能丰富。 Chrome团队在使用它时有一个insightful article,因此还有垃圾收集(GC)如何在javascript中工作,这是这个问题的核心。

由于delete基本上是Yochai Akoka当前接受的答案的根源,因此记住删除的内容非常重要。如果没有结合GC在接下来的两个答案中如何工作的概念,这是无关紧要的:如果现有对象的引用它没有被清理。答案更正确,但可能不太受欢迎,因为他们需要更多的思考而不仅仅是写'删除'。是的,一种可能的解决方案可能是使用delete,但是如果有另一个对内存泄漏的引用则无关紧要。

tinyLatticeworkFever恰当地提到了循环引用,Chrome团队文档可以提供更多的清晰度以及验证原因的工具。

由于这里提到了delete,因此提供资源Understanding Delete也可能有用。虽然它没有涉及与js的GC真正相关的任何实际解决方案。


7
投票

构造代码,以便所有临时对象都位于闭包内而不是全局命名空间/全局对象属性中,并在完成它们时超出范围。 GC将负责其余部分。


1
投票

我遇到了这样的问题,并且想要简单地改变有问题对象的孩子的innerHTML。

adiv.innerHTML = "<div...> the original html that js uses </div>";

看起来很脏,但它保存了我的生命,因为它有效!

© www.soinside.com 2019 - 2024. All rights reserved.