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

我是否正确理解Java中的内存泄漏,java,garbage-collection,Java,Garbage Collection,对于此代码片段: Vector v = new Vector(10); for (int i = 1; i<100; i++) {Object o = new Object(); v.add(o); o = null; } 向量v=新向量(10); 对于(inti=1;i,在第一个示例中,v仍然保存对100个对象的引用。 当v超出范围时,它将成为垃圾收集的候选对象,当它被收集时,也可以收集所有100个对象。 在第二个示例中,当您将v设置为n

对于此代码片段:

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

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


一般来说,没有必要将局部变量设置为null,当方法结束时,它将超出范围,并受GC约束。

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


一般来说,没有必要将局部变量设置为null,当方法结束时,它将超出范围,并受GC约束。

对100对象的引用不会保留。'o'显然在for循环的每次迭代中都超出范围,只留下向量内部的引用(在第一种情况下,
o=null
是没有意义的)。当您将
v
设置为其他值(null)时,不再引用向量,因此它及其内容可以被垃圾收集


这就是“引用计数”的意义所在;它是剩余有效引用的数量。您不能像在C中释放指针那样释放它们。如果引用的范围消失了(例如,因为它是函数的本地引用),引用已消失。您不必将其设置为null。对100对象的引用不会保留。'o'显然在for循环的每次迭代中都超出范围,只留下向量内部的引用(在第一种情况下,
o=null
是无意义的)。当您将
v
设置为其他值(null)时,将不再引用该向量,因此可以对其及其内容进行垃圾收集


这就是“引用计数”的意义所在;它是剩余有效引用的数量。您不能像在C中释放指针那样释放它们。如果引用的范围消失了(例如,因为它是函数的本地引用),引用已消失。您不必将其设置为null。

您不应该将引用设置为null。GC比我们更聪明,它知道什么时候有资格进行清理。您不应该将引用设置为null。GC比我们更聪明,它知道什么时候有资格进行清理打扫干净了。
 Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      }
   v= null;