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 :(得分:3)
不,这里没有内存泄漏。可以收集引用非垃圾对象的对象;只有引用的非垃圾对象才能成为垃圾。
答案 1 :(得分:0)
正如拉塞尔所说,这里没有内存泄漏。
当任何线程无法访问对象时,该对象有资格进行垃圾回收。
如果某个对象未被任何其他对象引用,则永远无法访问该对象。 但是,如果A和B指的是彼此,那并不意味着它们是可达的,因为它们都可以从任何线程无法访问。这就是我们所说的Island of isolation
请注意,在某些情况下,当您不使用普通引用(默认)但使用软引用或弱引用时,可以收集从线程可到达的对象。
可达性
从最强到最弱,可达性的不同程度 反映物体的生命周期。它们在操作上被定义为 如下:如果某个对象可以到达,则可以强烈访问该对象 线程没有遍历任何引用对象。一个新创建的 对象可由创建它的线程强烈访问。一个东西 如果它不可以到达但可以到达,则可以轻松到达 通过遍历软引用。如果是,则对象是弱可达的 既不强也不柔和,但可以通过遍历到达 一个弱的参考。当弱引用弱可达时 对象被清除,该对象有资格完成。一个 如果它既不是强烈的,也不是柔和的,那么它就是幽灵可达的 弱可达,它已经定型,并有一些幽灵参考 是指它。最后,一个对象无法访问,因此 当上述任何一个地方无法进行回收时,有资格进行回收 方式。
答案 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。