【问题标题】:How to release all memory allocated by an activity?如何释放活动分配的所有内存?
【发布时间】:2018-08-27 18:37:18
【问题描述】:

我有一个使用 recyclerView 的活动,每个项目的视图都有一个 Image.

我在 Destroy 上使用了 Garbage Collector GC(),如下所示

recyclerView= null; 
                 adapter=null;
                 Runtime.getRuntime().gc();

但是在释放内存的时候会发生下面的事情


我开始另一个使用毕加索从远程主机加载图像的活动它说
java.lang.OutOfMemoryError: Failed to allocate a 94784012 byte allocation with 4194304 free bytes and 87MB until OOM

我找到了一个答案,可以帮助我克服 OutOfMemoryError 通过 增加应用程序的堆大小 但我仍然想释放并确保释放 Activity 占用的内存,而不是增加应用程序的堆大小。提前致谢,请帮助完成该任务。

【问题讨论】:

  • 阅读此https://android.jlelse.eu/memory-leak-patterns-in-android-4741a7fcb570
  • 先生!如前所述(2)从GC根遍历内存中的所有对象引用并标记具有来自GC根的引用的活动对象。在被引用的页面上,它应该管理活动,因为我在 OnDestroy 中放置了 recyclerview=null 并调用了 GC 来收集它。

标签: android memory-management memory-leaks


【解决方案1】:

那里不需要您在onDestroy 方法中使用的代码。如果调用了destroy,您的活动将从堆栈中删除,并且无论如何都可以免费使用gc,其中所有资源仅由活动引用。

OnDestroy 并不总是被调用,这就是你的方法可能根本不会被调用的原因。您可以尝试在活动中显式调用finish(),然后将调用 onDestroy 并查看情况将如何变化。但随后活动将从堆栈中删除。

另外手动调用 gc 应该是不好的风格。在 Android 上,系统几乎总是知道何时是进行垃圾收集的最佳时间。大多数情况下,活动完成垃圾收集是自动触发的。

我会首先考虑调整您从Picasso 获得的图像的大小,因为即使有空间,它们通常对于您来说也可能太大。

查看调整大小选项link

【讨论】:

  • 先生,正如您所说,OnDestroy 并不总是被调用,但我已经在其中放置了一个日志,它会在活动被销毁时出现,当我们按下后,活动就会隐式完成。
  • 好的,如果你记录了 ondestroy 被调用,那么我建议你查看你加载的图片的大小,(当然除了增加堆大小作为最后一个选项)。也许这里会有一些其他的意见
  • 感谢您提供使用 Picasso 调整图像大小的建议但我仍然对释放 First 活动使用的内存很感兴趣。我已经通过使文件无效以防止缓存和管理网络缓存等为毕加索提供了解决方案,但我想释放 First Activity 使用的内存,该 Activity 从可绘制资源 id 获取图像资源。
【解决方案2】:

似乎问题与大图像有关,尽量不要将图像保存在内存中,仅按需加载图像(使用一些缓存策略)

尝试用滑翔代替毕加索。 Glide 提供更好的内存性能https://medium.com/@multidots/glide-vs-picasso-930eed42b81d

尝试使用最接近的上下文加载所有图像 https://stackoverflow.com/a/32887693/6193843

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2011-03-17
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多