Android ArrayList和堆中不断增长的Object []实例

时间:2013-07-21 17:41:34

标签: android memory-leaks arraylist heap heap-memory

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

...
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. befor the thread is started
  2. 线程运行一段时间后
  3. ; roundOverCondition永远不会是真的,但是
  4. 第一次将roundOverCondition改为true后直接
  5. (firstArrayList的大小为230)
  6. 第二次roundOverCondition之后直接
  7. (firstArrayList的大小为200)
  8. 结果如下:

    • 堆转储2显示堆中存在Integer,CustomObject和java.lang.Object []的实例

    • 堆转储3表明不再存在Integer和CustomObject的实例堆。 java.lang.Object []的所有实例仍然存在

    • 堆转储4显示堆中存在更多java.lang.Object []实例(没有Integer和CustomObject的实例)

    Integer和CustomObject的实例数的开发/行为符合预期。但是这个java.lang.Object []实例是什么?为什么你不收垃圾?

    Thx&问候:)

1 个答案:

答案 0 :(得分:0)

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

咨询docs for ArrayList并尝试使用大小的构造函数(或ensureCapacity())来测试假设。