当运行Android应用程序时,出现Intel HAXM和内存不足错误。
当运行Android应用程序时,出现Intel HAXM和内存不足错误。
我们在Intel HAXM模拟器上运行应用程序时遇到了内存不足错误。与此同时,当我们在普通的Android ARM模拟器上运行应用程序时,它是稳定的。错误日志如下:\n
12-03 12:13:20.258: ERROR/AndroidRuntime(3048): FATAL EXCEPTION: main java.lang.RuntimeException: 无法启动组件信息{coza.sintez.xplat/coza.sintez.xplat.activity.fields.NumberFieldActivity}的活动:android.view.InflateException:二进制XML文件第4行:膨胀类at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 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) Caused by: android.view.InflateException: 二进制XML文件第4行:膨胀类 at android.view.LayoutInflater.createView(LayoutInflater.java:518) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) at android.view.LayoutInflater.parseInclude(LayoutInflater.java:682) at android.view.LayoutInflater.rInflate(LayoutInflater.java:619) at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) at android.view.LayoutInflater.inflate(LayoutInflater.java:408) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.view.LayoutInflater.inflate(LayoutInflater.java:276) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207) at android.app.Activity.setContentView(Activity.java:1657) at coza.sintez.xplat.activity.fields.NumberFieldActivity.onCreate(NumberFieldActivity.java:51) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) ... 11 more Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:415) at android.view.LayoutInflater.createView(LayoutInflater.java:505) ... 26 more Caused by: java.lang.OutOfMemoryError: 位图大小超过VM预算 at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) at android.content.res.Resources.loadDrawable(Resources.java:1709) at android.content.res.Resources.getDrawable(Resources.java:581) at android.graphics.drawable.InsetDrawable.inflate(InsetDrawable.java:103) at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:787) at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:172) at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:787) at android.graphics.drawable.Drawable.createFromXml(Drawable.java:728) at android.content.res.Resources.loadDrawable(Resources.java:1694) at android.content.res.TypedArray.getDrawable(TypedArray.java:601) at android.view.View. (View.java:1951) at android.widget.TextView. (TextView.java:350) at android.widget.Button. (Button.java:108) at android.widget.Button. (Button.java:104) ... 29 more 12-03 12:13:20.318: WARN/ActivityManager(851): 强制完成活动coza.sintez.xplat/.activity.fields.NumberFieldActivity
\n所有的活动都经过了优化,并且不使用大型位图。DDMS内存分析器也没有显示任何内存泄漏。 \n我们还注意到,如果我们第一次运行应用程序,它可以执行某些任务(例如导航到某个活动)。但是,如果我们完全重新安装应用程序并再次运行,它在执行相同的任务时失败。似乎Intel模拟器没有正确释放内存。有人有过类似的经验吗?
Intel HAXM 是一个硬件加速器,用于加快在模拟器上运行的 Android 应用程序的性能。然而,有时在运行 Android 应用程序时,可能会遇到 "Out Of Memory" 错误。下面将介绍这个问题的原因以及解决方法。
在你的代码中出现了错误 "java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget"。这个错误是由于 Android 虚拟机内存不足而引起的。当加载大型图片或使用大量内存的操作时,Android 应用程序可能会超出虚拟机的内存限制,从而导致这个错误的出现。
解决这个问题的方法可以参考以下链接:https://stackoverflow.com/questions/4611822。在这个链接中,有许多不同的解决方案,可以根据具体情况选择适合自己的方法。
其中一种解决方法是使用更小的图片尺寸或更高的压缩率来减少内存占用。可以使用 BitmapFactory 的 inSampleSize
属性来缩小图片的尺寸,或使用 compress
方法来调整图片的压缩率。
另一种解决方法是在代码中及时释放不再使用的内存。可以通过调用 recycle
方法来释放 Bitmap 对象所占用的内存。
还有一种解决方法是增加应用程序的内存限制。可以通过在 AndroidManifest.xml 文件中的 application
标签下添加 android:largeHeap="true"
来增加应用程序的内存限制。
除了以上提到的解决方法外,还有其他一些可能的解决方案,可以根据具体情况进行尝试。希望这些解决方法能够帮助你解决 "Out Of Memory" 错误,并提升 Android 应用程序的性能。
问题:在运行Android应用程序时,出现了"Intel HAXM and Out Of Memory error"错误。
原因:这个问题的原因是位图大小超过了虚拟机(VM)预算。当第一次运行应用程序时,位图被加载到虚拟机的内存中。然而,即使在第二次运行应用程序时,位图工厂仍然保留着在虚拟机内存中的这个图像。
解决方法:在Activity的onDestroy()方法中移除位图,以释放内存。
代码示例:
@Override protected void onDestroy() { super.onDestroy(); bitmap.recycle(); }
通过执行上述操作,可以解决"Intel HAXM and Out Of Memory error"错误。
当在AVD中运行Android应用程序时,如果遇到Out of memory
错误而其他情况下没有出现该错误,不要感到惊讶。每个AVD都有自己的最大堆内存配置,而你在Intel模拟器上遇到这个问题的原因就是默认情况下你的应用程序可用的最大堆内存要小于ARM模拟器提供的堆内存。
你可以使用以下代码来检查应用程序可用的堆内存大小:
Log.d(TAG,"Heap size: " + Runtime.getRuntime().maxMemory());
尽管你可以控制模拟器的堆大小使其在两者上运行,但无法为用户设备这样做。所以,如果你的目标设备的堆大小较小,你需要检查你的代码,确保它适应这个内存量。否则,你可以在AndroidManifest.xml
中指定应用程序所需的最小堆大小,这样只会显示适合的设备。
在我的案例中,我发现位图不是存储在VM堆中,而是存储在本机堆中。我的应用程序慢慢占用了所有本机堆,然后崩溃。两个模拟器之间唯一的区别是在Intel模拟器上的阈值是10Mb,在ARM模拟器上是15Mb,所以你是对的。我使用了这个方法来监视本机堆的使用:int usedKBytes = (int) (Debug.getNativeHeapAllocatedSize() / 1024L);
解决这个问题的方法是检查你的代码,确保在处理位图时及时释放内存,并优化内存使用。另外,你可以尝试减小位图的大小或使用更高效的位图处理方法。这样可以减少应用程序对内存的需求,避免出现内存不足错误。