android - 如何修复 Android 模拟器上频繁出现的内存不足错误?

标签 android android-emulator out-of-memory

我测试了一个移动应用程序,并且在使用 Android 模拟器时一直在努力解决应用程序不断崩溃的问题。我在物理 Android 设备上没有问题,但模拟器每天崩溃几次。一旦我发现应用程序“工作流程”中容易崩溃的部分,应用程序就会一直崩溃。但应用程序中究竟在何处触发崩溃似乎因版本而异。

这是崩溃报告:

Android: 2.3.7
Model: Full Android on x86 Emulator

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:525)
at our.app.util.OurAppFileManager.getBrandingImageFromSD(OurAppFileManager.java:104)
at our.app.MainScreen.onResume(MainScreen.java:150)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
at android.app.Activity.performResume(Activity.java:3832)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

这是我的模拟器设置的屏幕截图:

emulator settings

我曾尝试更改 RAM 和 VM 堆以及内部存储设置,但运气不佳。事实上,如果我将 RAM 设置得太高,模拟器启动器会开始提示。

最佳答案

您要么真的用完了堆空间,要么堆太过 fragment 化以至于 Android 无法分配您请求的任何内容。这也会发生在生产设备上,因此恕我直言,将其视为模拟器问题是错误的。

我会首先使用 4.x 模拟器进行更多测试。在某种程度上,这将为您提供更好的崩溃信息,包括有多大的分配失败。在某种程度上,它会在使用 MAT 确定堆的去向时为您提供更好的结果。

StackOverflow 上有无数关于位图分配的 OutOfMemoryError 的问题和答案。您可能希望浏览一些。他们将向您指出相同的基本方向:

  • 在 Android 3.0+ 上,在传递给 BitmapFactoryBitmapOptions 上使用 inBitmap,以重用现有内存,而不是分配新内存

  • recycle() 你的 Bitmap 对象,当你用完它们时

  • 通常要注意内存分配,因为 Android 的垃圾收集器是非压缩的,所以最终您将无法再次分配大块内存

  • 使用 MAT 查看是否在导致问题的某处发生内存泄漏

等等。

关于android - 如何修复 Android 模拟器上频繁出现的内存不足错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17537038/

相关文章:

android-emulator - 提高 Linux 上 Android 模拟器在默认缩放下的文本质量

java - 如果我将最大堆大小设置为 2 GB,堆转储大小是多少?

android - 在Android中解析本地gpx文件

java - JSON 异常字符串无法转换为 JSON 对象

java - 如何将多个 edittext 值传递到 Arraylist 中,然后将其发送到另一个 Activity ?

Android 模拟器似乎不信任浏览器中的安全证书

android - 如何为三星 Galaxy S4 (1080X1920) 创建 avd

Android Studio - 如何增加分配的堆大小

android - 内存不足 : Heap Size Error after adding 10KB ImageButtons

android - 来自 Android 的 Facebook Score API 调用未在时间轴/代码上显示高分