Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget(转)

昨天遇到这个问题就是从一个输入流里调用BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri))得到一个bitmap报的错。第一次调用都没问题,第二次再次调用就会报上面那个内存溢出的问题。而且有的手机报有的手机不报。研究了半天终于解决。首先分析了下原因,应该是图片占用的内存超过了系统虚拟机可分配的最大限制。不同手机可能分配的最大值不一样。后来找到解决办法主要是设置BitmapFactory.Options。

  1. BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
  2. bitmapOptions.inSampleSize = 4;
  3. bitmap = BitmapFactory.decodeStream(this.getContentResolver()..openInputStream(uri), null , bitmapOptions);

复制代码

有的说要加上bitmapOptions.inJustDecodeBounds = true;但是我加上后得到的bitmap就为null。去掉之后就可以。按照上面的方法就解决问题了。最好把bitmap在不用的时候回收一下:

  1. if (bitmap != null && !bitmap.isRecycled())
  2. bitmap.recycle();

复制代码

某位大神的图片占用内存的算法:
介绍一下图片占用进程的内存算法吧。
android中处理图片的基础类是Bitmap,顾名思义,就是位图。占用内存的算法如下:
图片的width*height*Config。
如果Config设置为ARGB_8888,那么上面的Config就是4。一张480*320的图片占用的内存就是480*320*4 byte。
前面有人说了一下8M的概念,其实是在默认情况下android进程的内存占用量为16M,因为Bitmap他除了java中持有数据外,底层C++的skia图形库还会持有一个SKBitmap对象,因此一般图片占用内存推荐大小应该不超过8M。这个可以调整,编译源代码时可以设置参数。

时间: 2024-10-13 01:32:58

Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget(转)的相关文章

java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法

1 BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误.这往往是由于图片过大造成的.要想正常使用,则需要分配更少的内存空间来存储. BitmapFactory.Options.inSampleSize 设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误.inSampleSize的具体含义请参考SDK文档.例如: 1 2 3 BitmapFactory.Options op

解决 - java.lang.OutOfMemoryError: unable to create new native thread

以前常遇到此问题,一般想法就是修改配置启动参数,想方设法增大参数,认为这样可以避免内存溢出.但效果基本上还是会出错.我在网上找到了一篇文章解决此问题 点击打开链接 主要观点为 这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生.能创建的线程数的具体计算公式如下: (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads MaxProces

Android:java.lang.OutOfMemoryError:GC overhead limit exceeded

Android编译:java.lang.OutOfMemoryError:GC overhead limit exceeded 百度好多什么JVM啊之类的东西,新手简单粗暴的办法: 1.在的Model的build.gradle中配置 android{ -- dexOptions { incremental true javaMaxHeapSize "4g" } -- } 2.在项目的gradle.properties中: org.gradle.daemon=true org.gradl

Tomcat内存溢出解决java.lang.OutOfMemoryError: PermGen space

背景:把两个项目同时部署在tomcat,启动快好的时候,报java.lang.OutOfMemoryError: PermGen space 原因:因为两个项目的jar包太多,JVM把里面的class文件加载时把默认的内存撑爆了 解决方法: (1)查找了很多网上的方法,但是还是解决不了我的问题.我的解决方法是: 右键eclipse项目==>run as===èrun Configuration=看左边的Apache Tomcat 下面的tomcat…=è点击后右边的Argument, VM ar

解决 - java.lang.OutOfMemoryError: unable to create new native thread (转载)

一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题: 运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4, 测试程序: Java代码 import java.util.concurrent.CountDownLatch; public class TestNativeOutOfMemoryError { public static void main(String[] args) { for

weblogic 内存溢出解决 java.lang.OutOfMemoryError: PermGen space

解决办法: 1.在idea中,运行时给weblogic server中 VM options 配置增加内存的参数:-server -XX:PermSize=1024m -XX:MaxPermSize=1024m 如下图: 2.调整PermSize 的大小为如下后,再次开启正常.这个方法一般需要重启电脑,否则会显示端口被占用. 修改DOMAIN_HOME/bin/setDomainEnv.sh 中的 MaxPermSize值为1024M (根据实际需要调整) MEM_PERM_SIZE_64BIT

Tomcat7解决java.lang.OutOfMemoryError: PermGen space

上述两参数,可根据实际情况,逐渐调大. 原文地址:https://www.cnblogs.com/rgqancy/p/8422623.html

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 代码中存在死循环或循环产生过多重复的对象实体: 使用的

java.lang.OutOfMemoryError: unable to create new native thread(转)

解决 - java.lang.OutOfMemoryError: unable to create new native thread 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题: 运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP, 1.5.0_22, myeclipse 6.6, 测试程序: Java代码 import