2

我阅读了 KineticJS Docs 上的文档,它说:

destroy() - 删除和销毁自我

remove() - 从父级中删除自身,但不销毁

如果我的理解是正确的,remove() 函数会从父节点中删除节点,但仍分配在内存中。而 destroy() 完全释放内存,对吗?如果我使用破坏而不是删除,有人可以用外行的方式解释什么是复杂的吗?

先感谢您。

最热烈的问候,丹迪玲

4

1 回答 1

2

我相信你是对的,但只是为了补充你所说的,我认为你会使用:

remove() - 删除一个节点并可能稍后使用该节点

destroy() - 如果您知道不再需要该节点,则完全销毁该节点

此外,以下是直接取自 wiki 的垃圾收集的一些优点和缺点:http ://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

好处

垃圾收集将程序员从手动处理内存释放中解放出来。结果,某些类别的错误被消除或大大减少:

  • 悬空指针错误,当一块内存被释放而仍然有指向它的指针时发生,并且其中一个指针被取消引用。到那时,内存可能已被重新分配给另一个用途,结果无法预测。
  • 双重释放错误,当程序试图释放一个已经被释放的内存区域时,可能已经被再次分配。
  • 某些类型的内存泄漏,其中程序无法释放已变得无法访问的对象占用的内存,这可能导致内存耗尽。(垃圾收集通常不处理可访问的数据的无限积累,但程序实际上不会使用这些数据。)
  • 持久数据结构的有效实现 垃圾收集解决的一些错误可能具有安全隐患。

缺点

通常,垃圾收集具有某些缺点:

  • 垃圾收集在决定释放哪些内存时会消耗计算资源,即使程序员可能已经知道这些信息。在源代码中不手动注释对象生命周期的便利性的代价是开销,这可能导致性能下降或不均匀。在难以预测或在常规测试中检测到的情况下,与内存层次效应的交互会使这种开销变得无法忍受。
  • 实际收集垃圾的时刻可能无法预测,从而导致在整个会话中分散停顿。在实时环境、事务处理或交互式程序中,不可预测的停顿可能是不可接受的。增量、并发和实时垃圾收集器解决了这些问题,并进行了不同的权衡。
  • 非确定性 GC 与基于 RAII 的非 GC 资源管理不兼容。因此,对非 GC 资源的显式手动资源管理(释放/关闭)的需求变得可传递到组合。即:在非确定性 GC 系统中,如果一个资源或类似资源的对象需要手动资源管理(释放/关闭),而该对象被用作另一个对象的“一部分”,那么组合对象也将成为资源之类的对象本身需要手动资源管理(释放/关闭)。

还有来自 SO 的另一个参考:垃圾收集机制是如何工作的?

于 2013-06-26T13:11:02.770 回答