这段Java代码会造成内存泄漏吗?

在看这篇文章的时候,看到作者举了个例子。Java内存泄露的理解与解决(转) Vector v=new Vector(10); for (int i=1;i<100; i++){ Object o=new Object(); v.add(o); o=null; }
关注者
102
被浏览
13487
这段所谓的内存泄露的例子太过于含糊!以至于很难回答这个问题, 下面我尝试着揣测作者的用意来回答吧。

问主是好奇这段代码是否存在内存泄露,前面的"大野狼"说到没错:

  • 对于C/C++来说内存泄漏:是指在堆中一块被没有被释放的内存,同时又没有任何指针指向这块内存;
  • 对于Java来说的内存泄漏:是指堆中一块被没有被释放的内存,同时又存在GC Roots对象指向这个内存(即GC Roots可达),而事实上这块内存已不再需要,这便是Java应用开发者所需要关注的重点。关于GC 可以看我的另一个回答 垃圾回收机制中,引用计数法是如何维护所有对象引用的? - Gityuan 的回答
难道C/C++式的内存泄露,Java就就不存在吗?答案是的确不存在,C/C++式内存泄露便是GC Roots不可达的对象,在GC眼里这已经是内存垃圾了,就等着被回收了。

现在我们再回到问主的那个问题,下面代码是否存在内存泄露:
Vector v=new Vector(10);
for (int i=1;i<100; i++){
Object o=new Object();
v.add(o);
o=null;
}
如果Vector v的对象不再需要使用,而并没有及时释放,那么可以理解成这是"Java意义上的内存泄露";如果该对象还需要,这便不存在内存泄露。

这就好比Android经常遇到的一个内存泄露问题:当进行屏幕旋转,默认情况下会销毁掉当前的Activity,并创建新的Activity并保持之前的状态。如果该过程在新Activity中存在某些对象持有该销毁掉的Activity的引用,那么这就是内存泄露。这个解决方法是应尽量避免在Activity中使用非静态内部类,由于非静态内部类会隐式持有外部类实例的引用。

为什么这就是内存泄露呢?因为我们明确地知道旧的Activity引用不该持有。而问主的例子,并没有任何征兆表明Vector v在执行完循环后是否还有需要。