4

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

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

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

当在 UI 的 MainActivity 中调用 onDestroy() 时,关联的可绘制对象和资源保留在附加到前台服务的内存中,并且不会被垃圾收集。

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

此外,我可以使用android:processManifest 中的标签来分隔 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.
4

1 回答 1

0

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

这适用于极少数的应用程序。

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

这个Resources至少存在于每个 Dalvik 进程中,并且不能被删除。很可能BitmapDrawable$BitmapStateResources.

于 2013-04-22T18:11:48.590 回答