我的应用程序中有“以下代码”:
...
new Thread(new Runnable(){
@Override
public void run(){
while(true){
...
firstArrayList.add(new CustomObject());
...
secondArrayList.add(new Integer(integer1));
secondArrayList.add(new Integer(integer2));
...
if(roundOverCondition){
firstArrayList.clear();
secondArrayList.clear();
Thread.sleep(3000);
}
}
}
}).start();
...
我在 Eclipse 中做了四个堆转储。
- 在线程开始之前
- 线程运行一段时间后;roundOverCondition 从来都不是真的,然而
- 在第一次 roundOverCondition 为 true 之后(firstArrayList 的大小为 230)
- 在 roundOverCondition 第二次为真之后(firstArrayList 的大小为 200)
这就是结果:
堆转储 2 显示堆中存在 Integer、CustomObject 和 java.lang.Object[] 的实例
堆转储 3 表明不再存在 Integer 和 CustomObject 的实例堆。java.lang.Object[] 的所有实例仍然存在
heap dump 4 表明堆中存在更多 java.lang.Object[] 实例(没有 Integer 和 CustomObject 实例)
Integer 和 CustomObject 的实例数量的开发/行为符合预期。但是这个 java.lang.Object[] 实例是什么?为什么你不收集垃圾?
谢谢和问候:)