2013-04-07 50 views
0

对于下面的代码段:我是否理解正确的内存泄露Java中

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; 

会有漏电,因为我只清零的参考向量,但所有的100个对象的引用仍然存在,因此将不会被GC回收,而他们的对系统没有用处。

请帮助检查我是否正确理解Java中的内存泄漏,提前致谢!

+2

您不应该将引用设置为null。 GC比我们知道什么时候有资格进行清理要聪明得多。 – duffymo 2013-04-07 12:26:49

回答

3

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

通常,将局部变量设置为null并不需要真正的需要,当方法结束时,它将超出范围并且将成为GC的主题。

0

对100个对象的引用不保留。 'o'显然在for循环的每次迭代中超出范围,只留下向量的内部引用(第一种情况下的o=null毫无意义)。当您将v设置为其他内容(空)时,不再有对矢量的引用,因此可以对其进行垃圾回收。

这就是“引用计数”的意义;这是有效剩余参考的数量。如果引用的范围消失了(例如,因为它是本地的函数),那么引用就不存在了。 您不必将其设置为空。