如何在android中释放位图内存

时间:2022-08-28 17:18:33

In our program wo use lots of images,we unbindDrawables in eyery Activity and Fragment as below

在我们的程序中使用大量图像,我们在eyery Activity和Fragment中取消绑定,如下所示

protected void unbindDrawables(View view) {
    if (view != null) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ImageView) {
            ImageView imageView = (ImageView) view;
            imageView.setImageDrawable(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            if (!(view instanceof AbsSpinner) && !(view instanceof AbsListView)) {
                ((ViewGroup) view).removeAllViews();
            }
        }
    }
}

like this https://*.com/a/6779067 said,but I use the mat find that the bitmap also use a lots of memory and not release.

像这样https://*.com/a/6779067说,但我使用mat发现该位图也使用了大量内存而不是发布。

Class Name                               |   Objects | Shallow Heap | Retained Heap

 android.graphics.Bitmap                 |       490 |       23,520 | >= 36,267,912
 android.graphics.Bitmap$1               |         1 |            8 |          >= 8
 android.graphics.Bitmap$2               |         0 |            0 |         >= 80
 android.graphics.Bitmap$BitmapFinalizer |       490 |        7,840 |      >= 7,840
 android.graphics.Bitmap$CompressFormat  |         3 |           72 |        >= 232
 android.graphics.Bitmap$CompressFormat[]|         1 |           24 |         >= 24
 android.graphics.Bitmap$Config          |         4 |           96 |        >= 360
 android.graphics.Bitmap$Config[]        |         2 |           72 |         >= 72
 android.graphics.BitmapFactory          |         0 |            0 |         >= 80
 android.graphics.BitmapFactory$Options  |         0 |            0 |              
 android.graphics.BitmapRegionDecoder    |         0 |            0 |         >= 48
 android.graphics.BitmapShader           |         9 |          216 |     >= 15,736
 Total: 12 entries (4,509 filtered)      |     1,000 |       31,848 |              

I don't know why it not be released and how to release it,any body can help me,thanks a lot!

我不知道为什么它不会被释放以及如何释放它,任何身体都可以帮助我,非常感谢!

3 个解决方案

#1


5  

You must call bitmap.recycle() to release the native memory allocated when you decoded the bitmap.

您必须调用bitmap.recycle()以释放解码位图时分配的本机内存。

And of course you must have to take care of the life cycle of the bitmap. To release it at proper time. A better solution is to use some image loader class to take care of it. See https://github.com/nostra13/Android-Universal-Image-Loader

当然,您必须要处理位图的生命周期。在适当的时候释放它。更好的解决方案是使用一些图像加载器类来处理它。请参阅https://github.com/nostra13/Android-Universal-Image-Loader

#2


0  

call recycle on the bitmap and remove any references to your bitmap objects

在位图上调用recycle,并删除对位图对象的任何引用

#3


0  

The thing is that in the pre-Honeycomb versions of Android the memory for bitmaps was (is) allocated from unmanaged memory, which creates all sorts of problems. It is still released but from the finalizer of the bitmap object implementation. Which means that it will take at least 2 passes of GC to collect it. Also if for whatever reason the finalizer fails to execute - you got the picture. Another thing is - it is really difficult to trace - DDMS does not see it and neither does MAT.

问题在于,在前Honeycomb版本的Android中,位图的内存是从非托管内存分配的,这会产生各种各样的问题。它仍然是从位图对象实现的终结器发布的。这意味着需要至少2次GC通过才能收集它。如果由于某种原因终结器无法执行 - 你得到了图片。另一件事是 - 它真的很难追踪 - DDMS没有看到它,也没有MAT。

For Android 3.0 this has been changed and bitmaps are implemented over managed byte arrays, but for the older phones...

对于Android 3.0,这已被更改,位图是通过托管字节数组实现的,但对于较旧的手机......

#1


5  

You must call bitmap.recycle() to release the native memory allocated when you decoded the bitmap.

您必须调用bitmap.recycle()以释放解码位图时分配的本机内存。

And of course you must have to take care of the life cycle of the bitmap. To release it at proper time. A better solution is to use some image loader class to take care of it. See https://github.com/nostra13/Android-Universal-Image-Loader

当然,您必须要处理位图的生命周期。在适当的时候释放它。更好的解决方案是使用一些图像加载器类来处理它。请参阅https://github.com/nostra13/Android-Universal-Image-Loader

#2


0  

call recycle on the bitmap and remove any references to your bitmap objects

在位图上调用recycle,并删除对位图对象的任何引用

#3


0  

The thing is that in the pre-Honeycomb versions of Android the memory for bitmaps was (is) allocated from unmanaged memory, which creates all sorts of problems. It is still released but from the finalizer of the bitmap object implementation. Which means that it will take at least 2 passes of GC to collect it. Also if for whatever reason the finalizer fails to execute - you got the picture. Another thing is - it is really difficult to trace - DDMS does not see it and neither does MAT.

问题在于,在前Honeycomb版本的Android中,位图的内存是从非托管内存分配的,这会产生各种各样的问题。它仍然是从位图对象实现的终结器发布的。这意味着需要至少2次GC通过才能收集它。如果由于某种原因终结器无法执行 - 你得到了图片。另一件事是 - 它真的很难追踪 - DDMS没有看到它,也没有MAT。

For Android 3.0 this has been changed and bitmaps are implemented over managed byte arrays, but for the older phones...

对于Android 3.0,这已被更改,位图是通过托管字节数组实现的,但对于较旧的手机......