我的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.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.
答案 0 :(得分:0)
我的Android应用程序本质上是一个前台服务。应用程序的用户界面方面是用于此前台服务的设置和配置。
这适用于数量极少的应用。
检查gc根的路径没有提供关于为什么这些内容保留在内存中的线索,或者没有提供对它们的引用的信息。
Resources
至少在每个Dalvik流程中都无法删除。 BitmapDrawable$BitmapState
很可能与Resources
绑定。