如何释放活动分配的所有内存?

时间:2018-03-19 08:54:12

标签: android memory-management memory-leaks

我有一个使用recyclerView的活动,并且每个项目的视图都有一个图像。enter image description here

我在Destroy上使用了垃圾收集器GC(),如下所示

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

但是在释放内存enter image description here

时会发生以下情况

<小时/> 我开始另一个使用Picasso从远程主机加载图像的活动它说

java.lang.OutOfMemoryError: Failed to allocate a 94784012 byte allocation with 4194304 free bytes and 87MB until OOM

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

2 个答案:

答案 0 :(得分:3)

那里不需要您在onDestroy方法中使用的代码。如果调用destroy,那么你的acitivity将从堆栈中删除,并且对于gc而言是免费的,其中包含仅由活动引用的所有资源。

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

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

我会首先考虑调整从Picasso获得的图像的大小,因为即使有空间,它们也可能因为堆积而过大。

查看调整选项link

的大小

答案 1 :(得分:1)

似乎问题与巨大的图像有关,尝试不将图像保留在内存中,只按需加载图像(使用一些缓存策略)

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

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