在这个问题上花了 3 天,我很难过,真的可以在这方面使用你的帮助。
我的应用程序使用包含片段管理器的单个活动。在当前状态下,我将其设计为在任何时候都只附加一个片段。我打电话:
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment, mCurrent).commit();
删除现有片段并将其替换为新片段。碎片没有存储在其他任何地方。(只是 mCurrent 和在打开下一个片段时被替换的事务管理器)
发生的问题不是 OutOfMemory 异常,而是整个应用程序重新启动,因为设备本身内存不足。除了像 DeadObjectException 和:
9-17 11:34:14.742: W/InputDispatcher(341): channel ~ Consumer closed input channel or an error occurred. events=0x9
09-17 11:34:14.742: E/InputDispatcher(341): channel ~ Channel is unrecoverably broken and will be disposed!
这些来自设备日志,而不是我的应用程序日志。而且他们没有为我提供足够的信息来追踪导致他们的原因。应用程序的内存永远不会被释放,并且平板电脑从那时起就无法使用。
我已经使用了我知道的所有可用工具来分析内存泄漏是什么,但没有什么特别突出的。我使用 MAT (MemoryAnalyzerTool) 和 Eclipse DDMS 工具来找出可能出了什么问题。在我访问许多不同的片段后,MAT 报告使用的总内存在 8MB-16MB 之间。我查看了泄漏报告,似乎没有什么异常。Imageviews 大约 3MB,Bitmaps 大约 3MB,其他大约 8MB。在 DDMS 中,堆说我正在使用应用程序分配大小的约 50%。当我查看正在运行的进程的设置时,我访问的每个 Fragment 都会使我的应用程序的内存量在 30-140MB 之间波动,但是设备本身的内存永远不会减少,这就是设备内存不足的原因。即使应用程序完全关闭、退出、销毁,内存也永远不会释放。
我的假设是它要么在内存中保留片段本身,要么在这些片段中包含某些内容,即使我的应用程序不是。我在每次片段交换后调用 GC。
我使用的是三星 Galaxy Tab 2 10.1",但同样的问题出现在摩托罗拉 Xoom 上。
问题:
- 有没有人经历过这种行为?
- 任何人都可以向我提供有关其他工具的任何指导,以帮助我研究可能的内存泄漏吗?
- 是否有可以查看的系统进程详细显示设备内存是如何分配的?
谢谢你的时间。