Android java.lang.OutOfMemoryError: bitmap size exceeds VM budget

15 浏览
0 Comments

Android java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我试图将应用程序的布局从纵向改为横向,反之亦然。但是,如果我频繁地这样做,或者多次这样做,有时候我的应用程序会崩溃。以下是错误日志。请建议应该采取什么措施?\n01-06 09:52:27.787: ERROR/dalvikvm-heap(17473): 1550532字节的外部分配对于此进程来说太大了。01-06 09:52:27.787: ERROR/dalvikvm(17473): 内存不足:堆大小=6471KB,已分配=4075KB,位图大小=9564KB\n01-06 09:52:27.787: ERROR/(17473): 虚拟机不允许我们分配1550532字节\n01-06 09:52:27.798: DEBUG/skia(17473): --- 解码器->解码 返回了false\n01-06 09:52:27.798: DEBUG/AndroidRuntime(17473): 关闭虚拟机\n01-06 09:52:27.798: WARN/dalvikvm(17473): 线程id=3: 线程由于未捕获的异常退出(group=0x4001e390)\n01-06 09:52:27.807: ERROR/AndroidRuntime(17473): 未捕获的处理程序:主线程由于未捕获的异常退出\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): java.lang.RuntimeException:无法启动活动ComponentInfo{}:android.view.InflateException:二进制XML文件第2行:解析类时出错(LinearLayout.java:92)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at java.lang.reflect.Constructor.constructNative(Native Method)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.view.LayoutInflater.createView(LayoutInflater.java:500)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): ... 22 more\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): Caused by: java.lang.OutOfMemoryError:位图大小超过VM预算\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.content.res.Resources.loadDrawable(Resources.java:1705)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.content.res.TypedArray.getDrawable(TypedArray.java:548)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.view.View.(View.java:1850)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.view.View.(View.java:1799)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): at android.view.ViewGroup.(ViewGroup.java:296)\n01-06 09:52:27.857: ERROR/AndroidRuntime(17473): ... 26 more

0
0 Comments

在Android开发中,有时会遇到一个错误信息:java.lang.OutOfMemoryError: bitmap size exceeds VM budget。这个错误通常是由于使用了过大的位图而导致的。下面将介绍这个问题的出现原因以及解决方法。

出现原因:

当应用程序加载了一个过大的位图时,会导致内存溢出。Android系统为每个应用程序分配了一定的内存空间,称为VM(虚拟机)堆空间。当一个位图的大小超过了VM堆空间的限制时,就会出现这个错误。

解决方法:

为了解决这个问题,可以采取以下措施:

1. 优化图片资源:尽量使用压缩过的图片资源,减小位图的大小。可以使用工具对图片进行压缩,以减少内存占用。

2. 使用合适的位图尺寸:根据实际需要,选择合适的位图尺寸。不要使用过大的位图,可以根据屏幕大小和显示需求进行适当调整。

3. 及时回收内存:在不需要使用位图时,及时释放内存。可以使用bitmap.recycle()方法来释放位图占用的内存空间。

4. 使用android:largeHeap="true":在Android Manifest文件中的标签中添加android:largeHeap="true"属性。这个属性会告诉系统为应用程序分配更多的内存空间,从而减少内存溢出的可能性。

在解决这个问题时,可以根据具体情况采取以上措施,以确保应用程序能够正常运行,并避免出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget错误。

0
0 Comments

这是一个实用的答案,我试图在运行时避免这个问题。

调用垃圾收集器是一个好主意。

这个问题的出现原因是由于Android应用程序在加载和显示大型位图时,占用了大量的内存空间,超出了虚拟机的内存限制。这通常发生在使用不正确的位图处理方法时,或者在处理大量位图时。

解决这个问题的方法之一是手动调用垃圾收集器(Garbage Collector),以释放不再使用的内存。可以使用以下代码在运行时手动调用垃圾收集器:

Runtime.getRuntime().gc();

这将强制系统立即回收不再使用的内存,从而减少内存占用。然而,这只是一个临时的解决方案,不是长期解决问题的方法。

为了更好地解决这个问题,可以采取以下措施:

1. 优化位图加载和处理的方法,使用更有效的方式来处理位图,避免占用过多的内存。可以使用合适的位图缩放方法来减小位图的内存占用。

2. 使用缓存技术来管理位图的加载和释放。可以使用LRU缓存算法来缓存最近使用的位图,并在内存不足时释放较旧的位图。

3. 使用android:largeHeap属性来增加应用程序的堆内存限制。可以在AndroidManifest.xml文件中的标签中添加以下属性:

android:largeHeap="true"

这将增加应用程序的最大堆内存限制,从而减少OutOfMemoryError错误的发生概率。

请注意,以上方法只是解决这个问题的一些常见方法,具体的解决方法可能因应用程序的具体情况而异。因此,开发人员需要根据实际情况选择适合自己应用程序的解决方案。

0
0 Comments

在Android开发中,经常会遇到一个错误:java.lang.OutOfMemoryError: bitmap size exceeds VM budget。这个错误会在以下几种情况下出现:

1) 当从应用程序切换到其他应用程序,并在一段时间后返回应用程序时(按下Home按钮并浏览某些URL);

2) 当频繁登录/注销应用程序(在10秒内);

3) 当在设备上切换水平/垂直方向。

为了解决这个问题,可以尝试以下方法:

public void clearAllResources() {
    // 将相关变量设为空
    System.gc();
    Runtime.getRuntime().gc();
}

根据Android性能文档的说明,我们不应该试图强制垃圾回收,而是应该让Dalvik自己处理。最好不要隐藏内存问题的原因,而代之以CPU性能损失。

那么,什么时候调用clearAllResources()函数呢?

0