2012-01-24 16 views
2
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声明匿名实例并导致内存泄漏?会有一个隐式引用单身封闭实例的匿名类实例导致内存泄漏?

任何帮助赞赏!

+0

我假设这是java,添加了java标签 –

回答

3

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

+0

您可以详细说明如何识别非垃圾对象吗? – cheeken

+0

非垃圾对象是可访问的对象。可到达对象是可以从GC根目录访问的对象。 GC根通常是在运行线程的堆栈内存中保存的引用或加载类的静态状态。当在该对象和GC根目录之间无法构建引用路径时,对象无法访问。 – Dev

0

正如罗素所说,这里没有内存泄漏。

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

如果一个对象没有被任何其他对象引用,它永远不可访问。 但是,如果A和B互相引用,并不意味着它们可以访问,因为它们都可以从任何线程无法访问。这就是我们所说的Island of isolation

请注意,在某些情况下,如果您不使用常规引用(默认值),而是使用软引用或弱引用,则可以收集线程可访问的对象。

可达性

去从最强到最弱,不同层次可达性 的反映的对象的生命周期。它们的操作定义如下: 线程无需遍历任何引用对象就可以到达对象。新创建的 对象可由创建它的线程强制到达。如果对象 不能很好到达,则可以轻松到达,但可以通过遍历软引用到达 。如果某个对象不是强烈的,也不是轻度可达的,但是可以通过遍历 弱引用来达到该对象。当对弱可达对象的弱引用被清除时,对象就有资格完成。一个 对象是幻像可达,如果它既不强烈,也不软弱,也不可以弱可达,它已经完成,并且一些幻影参考 引用它。最后,一个对象是无法访问的,因此 符合回收的条件,当它不能以上述 的任何方式到达。

Reference package of Java API

0

这个答案是未来两年后的事实,但它在我类似的问题,面板上来时,我问:Reference to final object in anonymous class constructor a leak?

我给出了不同的答案比都@Russel和@ Sebestian因为他们依赖于内存泄漏的狭义定义。然而,GC语言中经常出现的泄漏是“保留一个参考,从而阻止GC收集它”。 http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html这对我来说似乎是OP如何使用该术语。我想他是在问我无意中让这个物体活着吗?我是否阻止GC宣称它?

如果这些是您的实际问题,那么答案是肯定的。 aList是bList的一个implict字段。只要bList保持活动状态,持有对bList的引用将防止收集aList。

相关问题