我花了整整4天的时间,想尽办法找出我正在开发的一个应用程序中的内存泄漏问题,但很久以前就没什么用了。
我正在开发的应用程序是社会性质的,所以想想配置文件活动(P)和列出活动与数据-例如徽章(B)。您可以从配置文件跳转到徽章列表到其他配置文件,其他列表等。
所以想象一个像这样的流程: P1-> B1-> P2-> B2-> P3-> B3,等等。为了保持一致性,我正在加载同一个用户的配置文件和徽章,所以每个 P 页面是相同的,每个 B 页面也是相同的。
这个问题的要点是: 在浏览了一段时间之后,根据每个页面的大小,我会在随机的地方得到一个内存不足的异常——位图、字符串等等——它似乎不是一致的。
在做了所有可以想象到的事情来找出内存不足的原因之后,我还是一无所获。我不明白的是,为什么 Android 不杀死 P1、 B1等等,如果它在加载时耗尽内存,而是崩溃。如果我曾经通过 onCreate ()和 onRestoreInstanceState ()返回到这些早期活动,我希望这些活动死亡并且复活。
更不用说这个了——即使我做 P1-> B1-> 后退-> B1-> 后退-> B1,我还是会崩溃。这表明存在某种内存泄漏,但即使在转储 hprof 并使用 MAT 和 JProfiler 之后,我也无法确定它的位置。
我已经禁用了从网络加载图像(并增加了加载的测试数据,以弥补它,使测试公平) ,并确保图像缓存使用 SoftReferences。Android 实际上试图释放它所拥有的为数不多的 SoftReferences,但就在它内存崩溃之前。
标签页面从网页获取数据,从 BaseAdapter 将数据加载到 EntityData 数组中,然后将数据提供给 ListView (我实际上使用的是 CommonsWare 的 优秀的合并适配器,但是在这个标签活动中,实际上只有一个适配器,但是无论如何我想提到这个事实)。
我已经看过代码了,找不到任何可能泄露的信息。我清空了所有能找到的内容,甚至 System.gc ()也左右删除了,但应用程序还是崩溃了。
我仍然不明白为什么堆栈中的非活动活动没有被收获,我真的很想弄清楚这一点。
此时此刻,我正在寻找任何线索,建议,解决方案... 任何有用的东西。
谢谢你。