2010-05-07 107 views
3

我正在编写一个应用程序,该应用程序具有一个前台服务,内容提供程序和一个活动前端,该前端绑定到服务并获取使用AIDL的对象列表。该服务确实工作并更新数据库。Android中的堆栈内存

如果我将该活动保留4-8小时,并进入手机设置下的“正在运行的服务”部分(Nexus One),则显示正在使用的异常大量内存(〜42MB)。

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

另注:我已经无法重现此问题时,UI不起来(只有在服务运行)

回答

1

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

如果这只是一个应用程序,摆脱AIDL并摆脱内容提供者。或者,至少,不要自己使用它们 - 这些是用于其他应用程序的。它们增加了你不需要用于自己虚拟机内部的东西的开销。

......这导致我理论上说,内存泄漏在堆栈上。这甚至有可能吗?

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

如果是这样,我该怎么做才能停止或 调查泄漏?

既然你已经做了测试SANS UI的“秒杀解决方案”,并确定这是确定的,我会慢慢重新引入的UI看,当你开始的问题。一个可能的候选问题区域将从后台线程更新活动,所以您可能会关闭它并查看会发生什么。

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

+0

服务真的是应用程序的主力,活动只是一个窗口,看看发生了什么。我的印象是真正将数据传回活动的唯一方法是绑定到服务并使用AIDL并对对象进行包裹。如果有更好的方法可以让我知道吗? 我曾怀疑图像可能在早期出现问题,并已退回到一个平铺背景PNG进行测试,大约是40KB。所以我不认为是这样。我有几个使用图层drawable(按钮,进度条)的UI元素,我不知道这些堆外效率如何。 – Matt 2010-05-07 20:28:53

+0

我最近尝试在应用程序中使用Timer的leu中的ScheduledExecutorService,如果我不正确地关闭它,线程池是否可以无限期地留在内存中?我将尝试恢复到基于计时器的解决方案,看看这是否会改变任何事情。 – Matt 2010-05-07 20:32:19

+0

谢谢你顺便回答,我担心没有人能够帮助这个奇怪的问题。 – Matt 2010-05-07 20:34:10