Foreground Service保留内存对象

时间:2013-04-22 18:00:41

标签: android memory-management

我的Android应用程序本质上是一个前台服务。应用程序的用户界面方面是用于此前台服务的设置和配置。

当通过应用程序UI启动服务时,它开始显示23mb的内存使用量。

当Android启动服务时(例如在启动时),它开始显示内存使用量为7mb。如果打开了应用程序UI,则内存使用量将增加到23mb。

当在UI的MainActivity中调用onDestroy()时,关联的drawable和资源将保留在连接到前台服务的内存中,并且不会被垃圾收集。

我可以通过调用MainActivity的onDestroy()中的System.exit(0)来“解决”此问题。 Android然后以7mb重新启动前台服务。

此外,我可以使用Manifest中的android:process标记来分隔UI和服务元素。

上述“解决方案”都没有解决实际问题,我希望在你的帮助下做到这一点!

通过Eclipse使用MAT工具,我可以看到各种对象都保留在内存中,只有两个显着大小:

Class Name | Shallow Heap | Retained Heap Percentage

class android.content.res.Resources @ 0x40ef7910 System Class|           40 |     8,475,664 |     68.71%
android.graphics.drawable.BitmapDrawable$BitmapState @ 0x411beb20|       40 |     1,127,720 |     9.14%

检查gc根的路径没有提供关于为什么这些内容保留在内存中的线索,或者没有提供对它们的引用的信息。

我已经尝试了使用MainActivity.thisgetApplicationContext()的上下文并删除了对静态变量的引用,但我无法摆脱这些内存对象。

非常感谢任何帮助。

编辑:gc根的路径,不包括弱引用:

Class Name | Shallow Heap | Retained Heap

class android.content.res.Resources @ 0x40ef7910 System Class|     40 |     8,475,664

Class Name      | Shallow Heap Retained Heap

android.graphics.drawable.BitmapDrawable$BitmapState @ 0x411beb20|  40 | 1,127,720

Class Name                              | Shallow Heap | Retained Heap**

[224] java.lang.Object[510] @ 0x41843738|        2,056 |     8,466,904

mValues android.util.LongSparseArray @ 0x40f46b28|  24 |     8,471,024

sPreloadedDrawables class android.content.res.Resources @ 0x40ef7910 SystemClass|          40 |     8,475,664

Found 1 path. No more paths left - for both entries.

1 个答案:

答案 0 :(得分:0)

  

我的Android应用程序本质上是一个前台服务。应用程序的用户界面方面是用于此前台服务的设置和配置。

这适用于数量极少的应用。

  

检查gc根的路径没有提供关于为什么这些内容保留在内存中的线索,或者没有提供对它们的引用的信息。

Resources至少在每个Dalvik流程中都无法删除。 BitmapDrawable$BitmapState很可能与Resources绑定。