我正在编写一个应用程序,它具有前台服务,内容提供程序和绑定到服务的Activity前端,并使用AIDL获取对象列表。该服务确实可以工作并更新数据库。
如果我将活动打开4-8 +小时,并转到手机设置(Nexus One)下的“正在运行的服务”部分,则会显示异常大量的内存(~42MB)。
我认为有泄漏。当我检查堆内存时,我得到堆大小:~18MB,分配~2MB,~16MB空闲。分析Eclipse MAT中的hprof似乎很好,这使我理论上内存在堆栈上泄漏。这甚至可能吗?如果是,我该怎么做才能阻止或调查泄漏?在Android的“正在运行的服务”部分报告的内存使用情况是否正确(我认为是)?
另一个注意事项:当UI未启动时(仅运行服务),我无法重现此问题
答案 0 :(得分:1)
我正在编写一个有应用程序的应用程序 前台服务,内容提供商, 以及绑定到的Activity前端 该服务并获取一个列表 使用AIDL的对象。
如果这只是一个应用程序,摆脱AIDL并摆脱内容提供商。或者,至少,不要自己使用它们 - 这些是供其他应用程序使用的。它们增加了你自己的VM内部不需要的开销。
...这让我理论认为内存在堆栈上泄漏。这甚至可能吗?
不是真的。主应用程序线程堆栈非常小。其他线程的堆栈可能会变得更大,但如果你以这种方式咀嚼42MB,我会感到惊讶。
如果是,我该怎么做才能停止或 调查泄漏?
由于你已经做了一个测试sans UI并确定没问题的“尖峰解决方案”,我会慢慢重新引入UI,看看你何时开始出现问题。一个可能的候选问题区域是从后台线程更新活动,因此您可以将其关闭,看看会发生什么。
由于你的问题不在堆本身,我的猜测是你的问题与位图或其他具有大量堆外RAM使用的东西有关。你化身中的相机是这个方向的另一个暗示。 :-)确保你recycle()
- 你的位图等等,看看是否有帮助。