gpt4 book ai didi

私有(private)字段的Java垃圾回收

转载 作者:行者123 更新时间:2023-11-29 04:35:40 27 4
gpt4 key购买 nike

考虑下面的类

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 始终保留旧集合中 A 的 8 个实例。因此,在某些时候查看内存分配时,我总是看到 A 的 8 个实例,但有大量的 HashMap 和 HeavyObject

最佳答案

我想你可能很困惑。

您的问题似乎不是 cache Map 是否被 gc'ed,而是 HeavyObject 是否被 gc'ed。而且您的 HeavyObjects 肯定会泄漏

public HeavyObject getThing();

关于私有(private)字段的Java垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41707230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com