考虑以下课程

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/

10-10 16:32