我的 Android 应用程序本质上是一个前台服务。应用程序的用户界面方面用于设置和配置此前台服务。
当通过应用程序 UI 启动服务时,它开始显示 23mb 的内存使用情况。
当 Android 启动服务时(例如在启动时),它开始显示 7mb 的内存使用量。如果打开应用程序 UI,内存使用量会增加到 23mb。
当在 UI 的 MainActivity 中调用 onDestroy() 时,关联的可绘制对象和资源保留在附加到前台服务的内存中,并且不会被垃圾收集。
我可以通过调用System.exit(0)
MainActivity 的 onDestroy() 来“解决”问题。然后 Android 在 7mb 处重新启动前台服务。
此外,我可以使用android:process
Manifest 中的标签来分隔 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.this
,getApplicationContext()
并删除了对静态变量的引用,但我就是无法摆脱这些内存对象。
任何帮助将不胜感激。
编辑:不包括弱引用的 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.