【问题标题】:Memory management for a tree object implementation in jsjs中树对象实现的内存管理
【发布时间】:2015-08-26 09:09:22
【问题描述】:

我尝试实现一个四叉树,但我对 clear 函数有疑问。
目前,树在每一步更新时都会重新构建,在此之前,我们必须清除当前结构。

我看到了一些不同的实现,例如 this。 在 clear 方法中,我们取消了 objects 数组和 sub-nodes 数组 递归 (array.length = 0).

为什么?如果我们简单地使根节点无效,垃圾收集器的行为会有所不同吗? (因为无法再访问子节点)还是“只是为了确定”问题?

谢谢!

【问题讨论】:

  • 在我看来“只是为了确定”。
  • 好的!测试后我会尽快更新主题。谢谢

标签: javascript memory-management garbage-collection quadtree


【解决方案1】:

在 Javascript 中,对象通过“引用的副本”传递。

因此,即使您取消了根节点,是的,子节点也无法再以简单的方式访问,但可能在某个地方存在对它的现有引用,因此它们会保留在内存中。

简单示例:

var o = {
    c: {
        a: true
    }
};

var reference_to_c = o.c;
o = null; // just removes reference

console.log(reference_to_c); // Object {a: true}

编辑:

关于array.length = 0;:David Walsh 解释here,为什么使用这种删除元素的方式不会涉及内存问题和空指针。

希望对您有所帮助。

【讨论】:

  • 但我看到 JavaScript 对象(和原语)在变得不可访问时会被垃圾回收。因此,在您的示例中,由于 reference_to_c 没有收集 c,如果我们设置 reference_to_c = null,它将被收集。对吗?
  • 是的,我认为垃圾回收是这样工作的。我更新了一个答案,所以也许会有所帮助。
  • 感谢您的帮助!因此,如果我们遵循这个逻辑,递归清除的兴趣是什么(在我的例子中,孩子们没有参考他们的父母)?
  • 我认为这更多是为了将 ref 从父级删除到子级和兄弟级,并确保垃圾收集器将递归地收集他们为每个节点执行的所有操作。可能这是“只是为了确定”的问题。
  • @Bergi - 我刚刚注意到 pdf 页脚处的“已停用文档”注释。我的错!关于留在内存中 - 我的意思是,如果我们在某个地方引用了一个变量,它将不会被收集。我试图在示例中展示它。答案已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多