Android java.lang.OutOfMemoryError: bitmap size exceeds VM budget
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行:解析类时出错
在Android开发中,有时会遇到一个错误信息:java.lang.OutOfMemoryError: bitmap size exceeds VM budget。这个错误通常是由于使用了过大的位图而导致的。下面将介绍这个问题的出现原因以及解决方法。
出现原因:
当应用程序加载了一个过大的位图时,会导致内存溢出。Android系统为每个应用程序分配了一定的内存空间,称为VM(虚拟机)堆空间。当一个位图的大小超过了VM堆空间的限制时,就会出现这个错误。
解决方法:
为了解决这个问题,可以采取以下措施:
1. 优化图片资源:尽量使用压缩过的图片资源,减小位图的大小。可以使用工具对图片进行压缩,以减少内存占用。
2. 使用合适的位图尺寸:根据实际需要,选择合适的位图尺寸。不要使用过大的位图,可以根据屏幕大小和显示需求进行适当调整。
3. 及时回收内存:在不需要使用位图时,及时释放内存。可以使用bitmap.recycle()方法来释放位图占用的内存空间。
4. 使用android:largeHeap="true":在Android Manifest文件中的
在解决这个问题时,可以根据具体情况采取以上措施,以确保应用程序能够正常运行,并避免出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget错误。
这是一个实用的答案,我试图在运行时避免这个问题。
调用垃圾收集器是一个好主意。
这个问题的出现原因是由于Android应用程序在加载和显示大型位图时,占用了大量的内存空间,超出了虚拟机的内存限制。这通常发生在使用不正确的位图处理方法时,或者在处理大量位图时。
解决这个问题的方法之一是手动调用垃圾收集器(Garbage Collector),以释放不再使用的内存。可以使用以下代码在运行时手动调用垃圾收集器:
Runtime.getRuntime().gc();
这将强制系统立即回收不再使用的内存,从而减少内存占用。然而,这只是一个临时的解决方案,不是长期解决问题的方法。
为了更好地解决这个问题,可以采取以下措施:
1. 优化位图加载和处理的方法,使用更有效的方式来处理位图,避免占用过多的内存。可以使用合适的位图缩放方法来减小位图的内存占用。
2. 使用缓存技术来管理位图的加载和释放。可以使用LRU缓存算法来缓存最近使用的位图,并在内存不足时释放较旧的位图。
3. 使用android:largeHeap属性来增加应用程序的堆内存限制。可以在AndroidManifest.xml文件中的
android:largeHeap="true"
这将增加应用程序的最大堆内存限制,从而减少OutOfMemoryError错误的发生概率。
请注意,以上方法只是解决这个问题的一些常见方法,具体的解决方法可能因应用程序的具体情况而异。因此,开发人员需要根据实际情况选择适合自己应用程序的解决方案。
在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()函数呢?