如何销毁JavaScript对象?

Ami*_*hah 73 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Yoc*_*oka 85

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

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 按F12以获取开发人员工具.转到"配置文件"选项卡,然后单击"开始"以启动配置文件.您可以对JS CPU,CSS Selector进行分析,您可以获取Heap快照. (10认同)
  • 或者在最新的chrome中输入js控制台中的单词性能 (3认同)

del*_*ver 31

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

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

  • 您能添加一个垃圾回收不会捕获的循环引用示例吗?要求朋友!;) (2认同)

Shw*_*ogg 28

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

它可能不像3年前那么强大,但Chrome Devevloper Tools" Profiles "部分现在非常强大且功能丰富.Chrome团队有一篇关于使用它的深刻文章,以及垃圾收集(GC)如何在javascript中工作,这是这个问题的核心.

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

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

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


Ole*_*kov 7

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