考虑以下课程
public class A {
private final Map<Integer, HeavyObject> cache;
public HeavyObject getThing();
}
假设不能泄露对缓存的引用,那么当A的实例存在时,是否会对缓存进行垃圾回收?我还假设HeavyObject最终超出范围。
我有理由相信,通过查看堆来实现并非如此,在某些情况下,会释放A的实例,而HeavyObject最终会导致JVM中断很多GC。
解决其中一项评论。在如下所示的函数中调用getThing():
void compute(A a) {
...
while(condition) {
...
HeavyThing thing = a.getThing();
...
}
}
因此,HeavyThing不可能摆脱困境。
a的生命周期是
Set<A> theAs = new HashSet();
while(true) {
for(int i = 0; i < 16; i++) theAs.add(new A());
theAs = computeNewAs(theAs);
}
请注意,棘手的一点是,computeNewAs始终保留旧集中的8个A实例。
因此,在某个时刻查看内存分配时,我总是看到A的8个实例,但有大量的HashMaps和HeavyObject
最佳答案
我想也许你很困惑。
看来您的问题不是cache
映射是否得到gc'ed,而是HeavyObject
是否得到gc'ed。而且您的HeavyObjects肯定会泄漏出去
public HeavyObject getThing();
关于java - Java垃圾收集私有(private)字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41707230/