【发布时间】:2014-06-21 21:12:13
【问题描述】:
我有一个显示大量活动的应用程序,每个活动都显示一个适合 100% 屏幕宽度且通常超过 100% 高度的位图。
当您触摸屏幕时,会创建一个新的活动,并在之前的活动中为位图调用完成和回收:
public void clean() {
if(this.myBitmap != null){
Log.d(DEBUG_TAG, " Cleaning "+this);
this.myBitmap.recycle();
this.myBitmap=null;
System.gc();
}
}
问题是所需的内存越来越大,当我启动超过 12-13 个活动时,这些消息会显示在 logcat:
05-05 16:03:02.909: I/dalvikvm-heap(24794): Clamp target GC heap from 65.790MB to 64.000MB
05-05 16:03:02.969: D/dalvikvm(24794): GC_EXPLICIT freed 71K, 5% free 59008K/61680K, paused 2ms+13ms, total 55ms
05-05 16:03:03.559: I/dalvikvm-heap(24794): Clamp target GC heap from 67.197MB to 64.000MB
05-05 16:03:03.569: D/dalvikvm(24794): GC_EXPLICIT freed 418K, 2% free 60521K/61680K, paused 3ms+28ms, total 109ms
经过更多的活动后,我遇到了这个崩溃:
05-05 16:03:05.049: E/AndroidRuntime(24794): java.lang.OutOfMemoryError
05-05 16:03:05.049: E/AndroidRuntime(24794): at android.graphics.Bitmap.nativeCreate(Native Method)
05-05 16:03:05.049: E/AndroidRuntime(24794): at android.graphics.Bitmap.createBitmap(Bitmap.java:809)
05-05 16:03:05.049: E/AndroidRuntime(24794): at android.graphics.Bitmap.createBitmap(Bitmap.java:786)
05-05 16:03:05.049: E/AndroidRuntime(24794): at android.graphics.Bitmap.createBitmap(Bitmap.java:718)
我不知道这里出了什么问题,我正在执行位图的 recycle(),并且我尝试了使用和不使用 System.gc(),在这两种情况下我都遇到了崩溃
【问题讨论】:
-
您是否将 largeHeapSize 标志添加到您的应用程序?
-
mmmm 感谢 deathember 似乎使用它已经改进了我的应用程序,但我认为这不是最终的解决方案
-
让我解释一下。当您在内存中使用大位图时,您将给出 OME。更多位图 - 获得 OUME 的机会更多。添加标志不是一个坏方法,因为 Android 可以让您获得最大堆大小以将对象加载到内存中。谷歌它为 Roman Guy 的 android 的内存管理。 Google 建议您使用此标志。但你有另一种方式。看看你的代码,也许你可以改进它,也许这可以修复你的 OME。
标签: android bitmap out-of-memory android-memory recycle