Android 在lrucache中缓存位图的奇怪行为

Android 在lrucache中缓存位图的奇怪行为,android,bitmap,out-of-memory,Android,Bitmap,Out Of Memory,我使用LRUCache缓存不同的对象并避免outofmemory问题。这适用于除位图之外的所有类型的JavaObject。有了位图,我在一段时间后解码一个文件(NativeDecodesset)时仍然会失去记忆。我可以跟踪内存消耗达到最大值 我只是做以下几点: public showbitmap(Canvas canvas,String BitmapID){ Bitmap bmtemp=(Bitmap) lrucache.get(BitmapID); if(bmtemp==n

我使用LRUCache缓存不同的对象并避免outofmemory问题。这适用于除位图之外的所有类型的JavaObject。有了位图,我在一段时间后解码一个文件(NativeDecodesset)时仍然会失去记忆。我可以跟踪内存消耗达到最大值

我只是做以下几点:

public showbitmap(Canvas canvas,String BitmapID){

    Bitmap bmtemp=(Bitmap) lrucache.get(BitmapID);

    if(bmtemp==null){
        bmtemp=getBitmapfromFile(BitmapID);
        lrucache.put(BitmapID,bmtemp);

    }

    if(bmtemp!=null){
        canvas.drawBitmap(bmtemp, ..., ...);
    }

}
我不会在画布之外使用位图。我想鲁卡什应该把它放出来。 有什么提示吗?我在论坛上读了很多关于这方面的文章,但仍然不知道如何避免这一点。我想这和内存碎片有关吧

我用entryRemoved增强了我的LRUCache,我看到了调试Bitmap.recycle调用的时间

@Override
                    protected void entryRemoved(boolean evicted, String key, Object oldobject, Object newobject) {
                       if(key.startsWith("_img_")){
                           ((Bitmap)oldobject).recycle();
                           Log.v("Debug recycle", "bitmap recycled !");
                       }
                    }
新信息:我认识到,即使我用executeAll()手动清理LRUCache,我的总内存(Runtime.getRuntime().totalMemory())也不会减少。当总内存接近最大内存时(Runtime.getRuntime().maxMemory()),则会出现我的OutofMemory错误


我不明白这一点。当LRUCache被完全清除时,为什么我的应用程序不能使用可用空间解码图像(NativeDeasset)?

尝试压缩bitmapIIRC位图是指向本机堆上大块内存的小对象。这就是为什么他们有
recycle()
方法:@18446744073709551615:以便我更好地理解。这是否意味着我放入LRUCache的位图仍然需要超出定义LRUCache的内存?我应该如何从LRUCache中回收它们?我在问题中添加了一些关于总内存和最大内存分析的新信息。。。