Android:重访垃圾收集:在onDestroy之后查看分配

时间:2013-01-30 02:26:48

标签: android garbage-collection

我发现这个很老的帖子基本上总结了我的问题:

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QsSjuB62Kow

该线程的结果(hackbod / mark / romain回答)对我来说似乎有点令人不满意,考虑到OP注意到这不会发生在1.5版之前。

长短:

Activity starts service.
finish is called on Activity.
Application's memory allocation remains constant
(despite views being garbage collected either eventually or manually)

我提起这件事的原因。

我有一个通过广播接收器启动的服务,使用大约5 MB。

当我的活动开始时,内存分配跳跃到40MB(我有很多视图正在进行,所以这是预期的)。活动结束,服务仍在运行(按设计)。内存分配仍然很高,我认为这是一个问题。

在此活动中,将所有内容onDestroy归零,遍历所有视图和数组并进行归零,System.gc()(是的,我知道它只是建议),强制GC,也不尽可能多地打开应用程序使总设备可用内存低于20%对此分配无效。即使没有活动痕迹(在MAT中花费大量时间),它仍然保持在40MB不变。

如何将此分配从40MB降至5MB?或者这不是Android的做事方式吗?

我已采取极端措施来确保上下文或对象不会从活动泄露到服务/等(实际上除了通过共享首选项之外没有任何引用)。如果您在原始帖子中看到非常基本的示例,我想这有助于阐明情况。

如果我将服务与活动分离,并且只运行服务或仅运行活动,但不能同时运行,则内存分配是可预测的。该服务从不消耗超过5MB,活动从不超过35MB。当调用onDestroy时,内存不再显示为每个内存分配。

我在Android 2.3和4.x中都注意到了相同的行为。

也许我在这里缺少一些基本的东西,或者这可能只是一个愚蠢的问题。

1 个答案:

答案 0 :(得分:1)

我通过MAT倾注了几个小时,正如安德鲁建议的那样,只要服务正在运行,一些Activity的资源仍然存在。

对于任何挣扎于此的人,我找到了一个便宜的简单修复。

只需在单独的流程中生成您的服务。

这" sorta"诀窍,现在当调用我的Activity onDestroy时,Activity使用的内存(在我的情况下为35MB)被移动到"缓存进程"并且活动的运行服务返回到之前的状态(在我的情况下为5MB)。

在你的清单中:

android:process属性是此处的关键。更多关于这一点:

http://developer.android.com/guide/topics/manifest/service-element.html