大家好,我现在有个机器,dalvik内存是42M, 经过很长时间的测试,发现会有OOM(out of memory),把现场dump文件拿来分析了下,显示的是HashMapEntry持有大量的对象,耗了大概11M左右的内存,根据调用tree发现是由sqlite的openOrCreateDatabase中的hashset.add-->hashmap.put->HashMapEntry引起的。我不知道这种情况是什么原因,是数据库没关掉吗?用的都是getWritableDatabase去打开数据库的,按照道理来说,如果是没有关闭应该不会有这么多内存泄漏啊,因为这个函数是只打开一次数据库,不会多次打开的。我想问下除了没有关闭数据库可能会影响,还有其他原因吗。

解决方案 »

  1.   

    用的时候打开,用完关立即关闭,测试一下是不是还有内存泄漏,反正以前用C操作sqlite的时候都是随用随开,用完立即关闭的 ……
      

  2.   

    每次使用都关闭cursor,调用cursor.close();
      

  3.   

    cursor.close肯定是关闭了。我只是不知道 如果使用SDK中的函数getWritableDatabase去打开数据库,如果一直不去关闭,那么会有内存泄漏吗(这个函数在SDK中介绍是打开1个可写的数据库,而且第1次如果打开了,后续就不用再打开了),那么如果我不关闭,而且我可能一直会用到这个数据库,那么是否会存在内存泄漏吗,这个函数最终调用的是HashMap,HashMap又使用的是强引用,我不知道是否会有影响。
      

  4.   

    你最好把db关掉。用的时候再getWritableDatabase,用完close。
      

  5.   

    可是看到framework很多地方都是这么用的,我就比较奇怪了,如果是问题,应改不会这么大量用