【问题标题】:In Javascript, does passing an object to another class cause memory leak?在 Javascript 中,将对象传递给另一个类会导致内存泄漏吗?
【发布时间】:2019-06-11 06:24:47
【问题描述】:

如果 A 类有一个对象并将其传递给 B 类,是否会因为 B 类引用 A 类中的对象而阻止 A 类进行垃圾回收?

【问题讨论】:

  • 请指定您要理解的语言的名称 - Java 和 Javascript 相当不同。
  • 好的,我刚改成javascript了
  • 如果 B 记得对 A 的引用,只要 B 和 B 对 A 的引用都存在,A 就不会被 GC'd。但是,B 应该只在需要时存在,并在需要 it 时保留 A 的引用。保留不需要的东西确实会导致内存泄漏。如果它只是一个对象,它是无关紧要的,如果你有一个循环在多个引用上执行它可能是灾难性的。 (虽然这与类无关,但与单个对象无关。)请注意,您可能会在 needed 的事情上耗尽内存,就像在垃圾上一样。

标签: javascript memory memory-leaks


【解决方案1】:

tldr
对象 A 将被垃圾回收。

为什么?
好吧,Javascript 中的每个对象只有在有对该对象的引用时才存在。由于在某些时候没有对对象 A 的引用,它将被删除。但是共享对象,我们称之为对象 C,从来没有被对象 A“拥有”,对象 A 只是对对象 C 的引用。由于 B 仍然对 C 的引用,所以 C 不会被删除。

非引用类型呢?
虽然引用类型从不拥有,而是作为引用存在,但原始类型由其父级拥有。

a = { x: "lorem ipsum" };
b = { y: a.x };

这意味着在上面的示例中,字符串“lorem ipsum”在内存中保存了两次。如果对象 a 被删除,那么字符串也是如此。这不会影响 b,因为字符串是按值复制的,这意味着它被第二次写入内存。

运行时如何知道引用了什么对象?
每次 GC 启动时,它都会开始标记所有可以通过顶级范围的引用到达的对象。在此过程中未标记的所有内容都将被删除(以某种方式,取决于正在运行的 GC 的类型)。

【讨论】:

  • 所以你是说对象 A 中除了对象 C(也在 A 中)之外的所有东西都将被垃圾回收?
  • 所有不是参考的东西。如果 A 有第二个对象,对象 D,并且只有 A 有对 D 的引用,那么 D 也将被垃圾回收,因为 A 删除了对 D 的最后一个引用。
猜你喜欢
  • 2020-03-27
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多