0

我的应用程序中有“以下代码”:

...
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 中做了四个堆转储。

  1. 在线程开始之前
  2. 线程运行一段时间后;roundOverCondition 从来都不是真的,然而
  3. 在第一次 roundOverCondition 为 true 之后(firstArrayList 的大小为 230)
  4. 在 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[] 实例是什么?为什么你不收集垃圾?

谢谢和问候:)

4

1 回答 1

0

ArrayLists 由数组支持。Object[]您在堆转储中看到的实例可能是ArrayList作为将项目添加到列表的副作用而创建的。

查阅ArrayList 的文档并尝试使用大小构造函数(或 ensureCapacity())来检验假设。

于 2013-07-21T19:28:53.620 回答