java - 我是否正确理解 Java 中的内存泄漏

标签 java garbage-collection

对于此代码片段:

Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      o = null;
     }

不会发生泄漏,因为这100个对象的引用都已设置为null,因此它们将被GC收集。

但是,

 Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      }
   v= null;

会有泄漏,因为我只清空了对 vector 的引用,但是对100个对象的所有引用仍然保留,因此不会被GC收集,因为它们对系统没有用处。

请帮忙检查一下我对Java内存泄漏的理解是否正确,先谢谢了!

最佳答案

在第一个示例中,v 仍然保留对 100 个对象的引用。 当 v 超出范围时,它将成为垃圾回收的候选者,当它被回收时,所有 100 个对象也可以被回收。
在第二个示例中 - 当您将 v 设置为 null 时,它将成为垃圾收集的候选者,当它被收集时,所有 100 个对象也可以被收集。
因此,在这两种情况下都不应该有任何泄漏。

一般情况下,没有必要将局部变量设置为 null,当方法结束时,它将超出范围并被 GC 处理。

关于java - 我是否正确理解 Java 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15862302/

相关文章:

java - TransformClassesWithNewClassShrinkerForDebug 错误

java - 在 t1.addView() 中出现错误 "t1 cannot be resolved as a variable"

python - 在Python中使用<128KB的字符串时发生内存泄漏?

swift - 如何识别 Swift 中的强引用循环?

c# - List<T>.Clear - 是否必须调用它?

java - 如何以编程方式从 XSD 架构生成 EMF 模型(.ecore、.genmodel)?

java - 退出按钮在 Actionlistener 后不起作用

c# - C++/命令行界面 : preventing garbage collection on managed wrapper of unmanaged resource

scala - 关于 Future.firstCompletedOf 和 Garbage Collect 机制

java - 棋盘游戏在 Java 中的实现