一个匿名类实例谁有一个隐含的引用单例封闭实例导致内存泄漏?

时间:2012-01-24 02:50:15

标签: java memory memory-leaks singleton

public class Singleton {

  public void processRequest(final List<a> aList) {

      List<b> bList = new AbstractList<b>() {
              b get(int i) {
                   return (b)aList.get(i); 
              }

              int size() {
                   return aList.size();
              }

             ......
      }

  }

这里创建一个匿名实例,其中包含对封闭实例的隐式引用。由于封闭实例是一个始终存在于JVM中的单例,这是否会阻止GC声明匿名实例并导致内存泄漏?

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

不,这里没有内存泄漏。可以收集引用非垃圾对象的对象;只有引用的非垃圾对象才能成为垃圾。

答案 1 :(得分:0)

正如拉塞尔所说,这里没有内存泄漏。

当任何线程无法访问对象时,该对象有资格进行垃圾回收。

如果某个对象未被任何其他对象引用,则永远无法访问该对象。 但是,如果A和B指的是彼此,那并不意味着它们是可达的,因为它们都可以从任何线程无法访问。这就是我们所说的Island of isolation

请注意,在某些情况下,当您不使用普通引用(默认)但使用软引用或弱引用时,可以收集从线程可到达的对象。

  

可达性

     

从最强到最弱,可达性的不同程度   反映物体的生命周期。它们在操作上被定义为   如下:如果某个对象可以到达,则可以强烈访问该对象   线程没有遍历任何引用对象。一个新创建的   对象可由创建它的线程强烈访问。一个东西   如果它不可以到达但可以到达,则可以轻松到达   通过遍历软引用。如果是,则对象是弱可达的   既不强也不柔和,但可以通过遍历到达   一个弱的参考。当弱引用弱可达时   对象被清除,该对象有资格完成。一个   如果它既不是强烈的,也不是柔和的,那么它就是幽灵可达的   弱可达,它已经定型,并有一些幽灵参考   是指它。最后,一个对象无法访问,因此   当上述任何一个地方无法进行回收时,有资格进行回收   方式。

Reference package of Java API

答案 2 :(得分:0)

这个答案将在事情发生2年后出现,但当我问及Reference to final object in anonymous class constructor a leak?

时,它出现在我的类似问题窗格下面

我给出了与@Russel和@Sebestian不同的答案,因为它们依赖于内存泄漏的狭义定义。然而,在GC语言中通常意味着什么泄漏是保持参考,从而阻止GC收集它。&#34; http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html对我而言,似乎OP正在使用这个术语。我想他是在问我是不是故意让这个物体活着?我是否阻止GC声称它?

如果这些是您的实际问题,那么答案是肯定的。 aList是bList的隐含字段。只要bList保持活动状态,持有对bList的引用就会阻止收集aList。