Android:内存不足错误

vau*_*uge 4 memory heap android bitmap

当我将Android应用程序最小化大约4或5次时,我总是会收到以下错误:

02-01 19:24:11.980: E/dalvikvm-heap(22362): Out of memory on a 3686416-byte allocation.
02-01 19:24:12.000: E/dalvikvm(22362): Out of memory: Heap Size=62755KB, Allocated=55237KB, Limit=65536KB
02-01 19:24:12.000: E/dalvikvm(22362): Extra info: Footprint=62435KB, Allowed Footprint=62755KB, Trimmed=2144KB
02-01 19:24:12.000: E/Bitmap_JNI(22362): Create Bitmap Failed.    
02-01 19:24:12.000: E/Bitmap_JNI(22362): Failed to create SkBitmap!
02-01 19:24:12.000: E/AndroidRuntime(22362): FATAL EXCEPTION: main
02-01 19:24:12.000: E/AndroidRuntime(22362): java.lang.OutOfMemoryError: (Heap Size=62755KB, Allocated=55237KB)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.graphics.Bitmap.nativeCreateScaledBitmap(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:744)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at de.vauge.mb.Utils.getResizedBitmap(Utils.java:56)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at de.vauge.mb.MenuView.initialize(MenuView.java:74)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at de.vauge.mb.MenuView$1.handleMessage(MenuView.java:137)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.os.Looper.loop(Looper.java:156)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at android.app.ActivityThread.main(ActivityThread.java:5045)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at java.lang.reflect.Method.invokeNative(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at java.lang.reflect.Method.invoke(Method.java:511)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-01 19:24:12.000: E/AndroidRuntime(22362):    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我的应用程序只包含一个活动,其中包含7个不同的,自编的视图(所有这些视图都包含一些位图),当它们不需要时它们被切换为隐形(可能不是很好的风格,但它对我有效,直到现在...).这些视图中的每一个都有一个destroy() - 函数,它循环使用它中的所有Bitmaps,MainActivity的onDestroy()调用所有那些destroy() - 函数.此外,我没有使用任何静态位图.

那么,除了回收所有位图而不使用静态位图之外,还有什么我可以尝试的吗?

Ben*_*ein 9

好.Android上的位图可能有点棘手.您能否提供有关位图来源及其大小的更好信息?

否则,我建议调查这些事情:

  1. 如果您要加载远程图像,请查看壁画.你也可以看看毕加索.我个人以前喜欢ImageLoader,但它不再被维护了.

  2. 如果您正在使用以前是推荐选项的inPurgable标志,请尝试找到解决方法,因为它实际上会为每个图像分配更多内存.

  3. 如果经常解码小型本地资产,请考虑将您的drawable保存在hashmap中,并在需要时重用它们.减去GC.

  4. 如果您关心应用程序的子类,您可以使用OnLowMemory调用来了解您可能真正需要清理的时间(主要用于调试,而不是现实生活情况)......如果这还不太晚...... :)

  5. 看看Chris Banes的博客.是一个非常有趣的内存缓存解决方案

  6. 实现您可以随时调用的内存修整器.

  7. 另一个不足为奇的优化是在您可以使用较小的对象时...考虑一下您的最小数据模型和图像大小,并尝试为这些设备提供一致的API.