3

我正在编写一个应用程序,该应用程序具有前台服务、内容提供程序和绑定到服务并使用 AIDL 获取对象列表的 Activity 前端。该服务确实有效并更新了数据库。

如果我将活动打开 4-8 小时以上,然后转到手机 (Nexus One) 设置下的“运行服务”部分,则会显示正在使用的内存量异常大 (~42MB)。

我认为有泄漏。当我检查堆内存时,我得到堆大小:~18MB,~2MB 已分配,~16MB 可用。分析 Eclipse MAT 中的 hprof 似乎很好,这使我推断出堆栈上的内存泄漏。这甚至可能吗?如果是,我能做些什么来阻止或调查泄漏?android的“运行服务”部分报告的内存使用情况是否正确(我认为是)?

另一个注意事项:当 UI 未启动(仅运行服务)时,我无法重现此问题

4

1 回答 1

1

我正在编写一个应用程序,该应用程序具有前台服务、内容提供程序和绑定到服务并使用 AIDL 获取对象列表的 Activity 前端。

如果这只是一个应用程序,请摆脱 AIDL 并摆脱内容提供者。或者,至少不要自己使用它们——这些是供其他应用程序使用的。它们增加了您自己的 VM 中不需要的东西的开销。

...这使我推测堆栈上的内存正在泄漏。这甚至可能吗?

并不真地。主应用程序线程堆栈非常小。其他线程的堆栈可能会变得更大,但是如果您以这种方式咀嚼 42MB,我会感到惊讶。

如果是,我能做些什么来阻止或调查泄漏?

由于您已经完成了测试 sans UI 并确定没问题的“尖峰解决方案”,我会慢慢重新引入 UI 并看看您何时开始遇到问题。一个可能的候选问题区域是从后台线程更新活动,因此您可以将其关闭并查看会发生什么。

由于您的问题不在堆本身,我的猜测是您的问题与位图或其他具有大量堆外 RAM 使用率的事物有关。你头像中的相机是这个方向的另一个提示。:-) 确保您正在使用recycle()您的位图等,看看是否有帮助。

于 2010-05-07T19:54:33.433 回答