如何销毁JavaScript对象?

时间:2012-04-20 12:25:47

标签: javascript object destroy

最近,我遇到了一个耗费太多内存且增加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();
}

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

5 个答案:

答案 0 :(得分:79)

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

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

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

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

答案 1 :(得分:30)

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

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

答案 2 :(得分:24)

虽然现有的答案已经提供了解决问题的解决方案和问题的后半部分,但它们没有提供问题的前半部分的自我发现方面的答案:&#34;如何我可以看到哪个变量导致内存开销 ...?&#34;

3年前它可能不那么强劲,但Chrome开发者工具&#34; 个人资料&#34;部分现在相当强大,功能丰富。 Chrome团队在使用它时有一个 insightful article ,因此垃圾收集(GC)在javascript中也是如此,这是这个问题的核心。

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

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

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

答案 3 :(得分:7)

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

答案 4 :(得分:1)

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

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

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