【发布时间】:2026-01-11 11:45:01
【问题描述】:
我的理解是,弱可达对象在下一个 GC 周期被垃圾收集,如果这是真的,那么我不应该在下面的代码中得到 OutOfMemoryError,但是在运行 10-15 分钟后我得到 OOM 错误。
List<Object> list = new ArrayList<>();
while (true) {
for(int i = 0; i < 1000000; i++){
list.add(new WeakReference<Object>(Calendar.getInstance()));
}
}
有人能解释一下为什么我仍然会得到 OOM,我知道列表的大小会不断增加,但我的意思是,我使用 Calendar.getInstance() 创建的日历对象将在每次 1000000 迭代后被 GC'ed因此,如果我在 1000000 迭代中没有收到 OOM 错误,那么我不应该在任何后续循环中得到它,因为所有以前的 Calender 对象都会在下一个循环中进行 GC?
【问题讨论】:
-
GC 不会中断正在运行的方法。
-
@TimothyTruckle 我在哪里说 GC 正在中断正在运行的方法?
-
你的代码和你的语句一起...
-
@TimothyTruckle - 我不明白你想说什么,但是 GC 可以并且会中断正在运行的方法;见*.com/questions/19201332/java-gc-safepoint
标签: java memory-management memory-leaks