我正在编写一个应用程序,它有一个前台服务、内容提供者和一个绑定到服务并使用AIDL返回对象列表的活动前端。该服务确实可以工作并更新数据库。
如果我让活动打开4-8个多小时,并转到手机(Nexus One)设置下的“运行服务”部分,会显示异常大的内存使用量(~42MB)。
我想可能是有漏洞。当我检查堆内存时,我得到了堆大小:~18MB,~2MB已分配,~16MB可用。分析Eclipse MAT中的hprof似乎很好,这导致我推断内存在堆栈上泄漏。这有可能吗?如果是,我可以做些什么来阻止或调查泄漏?android的“运行服务”部分报告的内存使用量是否正确(我假设是正确的)?
另一个注意事项:当UI没有启动(只有服务在运行)时,我无法重现这个问题
发布于 2010-05-08 03:54:33
我正在写一个应用程序,它有一个前台服务,内容提供者,以及一个绑定到服务并使用AIDL返回对象列表的活动前端。
如果这只是一个应用程序,那就去掉AIDL,去掉内容提供商。或者,至少不要自己使用它们--这些是供其他应用程序使用的。它们增加了您在自己的虚拟机中不需要的开销。
...which引导我推断堆栈上的内存正在泄漏。这有可能吗?
不怎么有意思。主应用程序线程堆栈非常小。其他线程的堆栈可能会变得更大,但如果您以这种方式占用了42MB,我会感到惊讶。
如果是,我可以做些什么来阻止或调查泄漏?
由于您已经做了测试sans UI的“尖峰解决方案”,并确定这是可以的,所以我将慢慢重新介绍UI,看看您什么时候开始遇到问题。一个可能的候选问题领域是从后台线程更新活动,因此您可以将其关闭并查看发生了什么。
由于您的问题不在堆本身,因此我猜测您的问题与位图或其他具有大量堆外RAM使用率的东西有关。你头像中的摄像头是这个方向的另一个线索。:-)确保你是recycle()
-ing你的位图之类的,看看这是否有帮助。
https://stackoverflow.com/questions/2790826
复制相似问题