Android OOM的解决方式

版权声明:本文为博主原创文章。转载请注明出处。 https://blog.csdn.net/Main_Stage/article/details/26150189
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,
由于这些函数在完毕decode后,终于都是通过java层的createBitmap来完毕的,须要消耗很多其它内存。


因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,
decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完毕decode。
无需再使用java层的createBitmap,从而节省了java层的空间。
假设在读取时加上图片的Config參数,能够跟有效降低载入的内存。从而跟有效阻止抛out of Memory异常
另外,decodeStream直接拿的图片来读取字节码了, 不会依据机器的各种分辨率来自己主动适应, 
使用了decodeStream之后,须要在hdpi和mdpi,ldpi中配置对应的图片资源, 
否则在不同分辨率机器上都是相同大小(像素点数量),显示出来的大小就不正确了。


另外,下面方式也大有帮助:
1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
     BitmapFactory.Options options=new BitmapFactory.Options();
     options.inJustDecodeBounds = false;
     options.inSampleSize = 10;   //width。hight设为原来的十分一
     Bitmap btp =BitmapFactory.decodeStream(is,null,options);
2. if(!bmp.isRecycle() ){
         bmp.recycle()   //回收图片所占的内存
         system.gc()  //提醒系统及时回收
}


下面奉上一个方法:


Java代码


   1. /**
   2.  * 以最省内存的方式读取本地资源的图片
   3.  * @param context
   4.  * @param resId
   5.  * @return
   6.  */  
   7. public static Bitmap readBitMap(Context context, int resId){  
   8.     BitmapFactory.Options opt = new BitmapFactory.Options();  
   9.     opt.inPreferredConfig = Bitmap.Config.RGB_565;   
  10.     opt.inPurgeable = true;  
  11.     opt.inInputShareable = true;  
  12.        //获取资源图片  
  13.     InputStream is = context.getResources().openRawResource(resId);  
  14.         return BitmapFactory.decodeStream(is,null,opt);  
  15. }




================================================================================
Android内存溢出的解决的方法


转自:http://www.cppblog.com/iuranus/archive/2010/11/15/124394.html?opt=admin


昨天在模拟器上给gallery放入图片的时候,出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget 异常,图像大小超过了RAM内存。


      模拟器RAM比較小,仅仅有8M内存。当我放入的大量的图片(每一个100多K左右),就出现上面的原因。
由于每张图片先前是压缩的情况。放入到Bitmap的时候。大小会变大。导致超出RAM内存,详细解决的方法例如以下:


//解决载入图片 内存溢出的问题
                    //Options 仅仅保存图片尺寸大小,不保存图片到内存
                BitmapFactory.Options opts = new BitmapFactory.Options();
                //缩放的比例。缩放是非常难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰
                opts.inSampleSize = 4;
                Bitmap bmp = null;
                bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);                             


                ...              


               //回收
                bmp.recycle();


通过上面的方式攻克了,可是这并非最完美的解决方案。




通过一些了解,得知例如以下:


优化Dalvik虚拟机的堆内存分配


对 于Android平台来说,其托管层使用的Dalvik Java VM从眼下的表现来看还有非常多地方能够优化处理,比方我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理。使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法能够增强程序堆内存的处理效率。当然详细 原理我们能够參考开源project,这里我们仅说下用法:   private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就能够调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 就可以。




Android堆内存也可自定义大小


    对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,眼下手机厂商对RAM都比較吝啬,对于软件的流畅性来说RAM对 性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还能够强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:


private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;


VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。

当然对于内存吃紧来说还能够通过手动干涉GC去处理




bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法
★android 中用bitmap 时非常easy内存溢出。报例如以下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget


● 主要是加上这段:
BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;


● eg1:(通过Uri取图片)
private ImageView preview;
BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 2;//图片宽高都为原来的二分之中的一个,即图片为原来的四分之中的一个
                    Bitmap bitmap = BitmapFactory.decodeStream(cr
                            .openInputStream(uri), null, options);
                    preview.setImageBitmap(bitmap);
以上代码能够优化内存溢出。但它仅仅是改变图片大小。并不能彻底解决内存溢出。
● eg2:(通过路径去图片)
private ImageView preview;
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;//图片宽高都为原来的二分之中的一个,即图片为原来的四分之中的一个
                        Bitmap b = BitmapFactory.decodeFile(fileName, options);
                        preview.setImageBitmap(b);
                        filePath.setText(fileName);


★Android 另一些性能优化的方法:
●  首先内存方面。能够參考 Android堆内存也可自定义大小 和 优化Dalvik虚拟机的堆内存分配


●  基础类型上。由于Java没有实际的指针。在敏感运算方面还是要借助NDK来完毕。

Android123提示游戏开发人员。这点比較有意思的是Google 推出NDK可能是帮助游戏开发人员,比方OpenGL ES的支持有明显的改观,本地代码操作图形界面是非常必要的。


●  图形对象优化,这里要说的是Android上的Bitmap对象销毁。能够借助recycle()方法显示让GC回收一个Bitmap对象,通常对一个不用的Bitmap能够使用下面的方式,如


if(bitmapObject.isRecycled()==false) //假设没有回收  
         bitmapObject.recycle();   


●  眼下系统对动画支持比較弱智对于常规应用的补间过渡效果能够,可是对于游戏而言一般的美工可能习惯了GIF方式的统一处理,眼下Android系统仅能预览GIF的第一帧,能够借助J2ME中通过线程和自己写解析器的方式来读取GIF89格式的资源。


● 对于大多数Android手机没有过多的物理按键可能我们须要想象下了做好手势识别 GestureDetector 和重力感应来实现操控。通常我们还要考虑误操作问题的降噪处理。


Android堆内存也可自定义大小


   对于一些大型Android项目或游戏来说在算法处理上没有问题外,影响性能瓶颈的主要是Android自己内存管理机制问题,眼下手机厂商对RAM都比 较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感。除了上次Android开发网提到的 优化Dalvik虚拟机的堆内存分配外。我们还能够强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:


private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;


VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。

当然对于内存吃紧来说还能够通过手动干涉GC去处理。我们将在下次提到详细应用。


优化Dalvik虚拟机的堆内存分配


对 于Android平台来说。其托管层使用的Dalvik JavaVM从眼下的表现来看还有非常多地方能够优化处理,比方我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法能够增强程序堆内存的处理效率。当然详细 原理我们能够參考开源project,这里我们仅说下用法:   private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就能够调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 就可以。
 
 
介绍一下图片占用进程的内存算法吧。


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。这个能够调整,编译源码时能够设置參数。

转载于:https://www.cnblogs.com/ldxsuanfa/p/10805222.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的成员运算符_在Python中使用成员运算符的示例

下表列出了所有python语言支持的成员运算符。例如:试试下面的例子就明白了所有的python编程语言提供会员运算符:#!/usr/bin/pythona 10b 20list [1, 2, 3, 4, 5 ];if ( a in list ):print "line 1 - a is available in the given list"else…

(SQL语句)按指定时间段分组统计

我现在有一张表: 列名1 时间 03174190188 2009-11-01 07:17:39.217 015224486575 2009-11-01 08:01:17.153 013593006926 2009-11-12 08:04:46.560 013599584239 2009-11-22 08:53:27.763 013911693526 2009-11-23 08:53:51.683 013846472440 2009…

如何查看Exchange2010中邮箱数据库的用户邮箱占用情况

在EMS界面,用以下命令可以看到数据库的使用情况,并将文件放在指定文件显示: Get-Mailbox -database DBNAME|Get-Mailboxstatistics |sort totalitemsize -desc |ft displayname,totalitemsize,itemcount > D:\report\DBNAME.csv 转载于:ht…

数据库迁移_数据库迁移了解一下

mongodb数据迁移因服务器到期,需要将之前机器上面的数据进行数据迁移,并将服务全部docker化备份首先需要将现有即将到期的服务器上面的mongo数据进行备份mongodump -h dbhost -d dbname -o dbdirectory-h:mongodb所在服务器地址,可…

extern “C”总结

学了就忘,忘了再学。有时感觉自己几乎就是一个跳梁小丑。没有办法,只好多记些笔记。本文版权归作者和博客园共有FROM: http://www.cnblogs.com/graphics/archive/2010/12/24/1916343.html经常看到如下代码:#ifdef _cplusplusexter…

人脸颜值评分软件_在线算个颜值,特科学的那种 | 知多少

用 AI,科学的为颜值打个分。用 AI,打造科学颜值打分器https://www.zhihu.com/video/1185672892095848448图文版本送给不方便打开的朋友 (●u●)」如何科学的为颜值打个分?三庭五眼、四高三低?脸部是否对称?是否与本民族…

图片翻转

图片翻转 原文:图片翻转本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。这一节继续为大家介绍CSS3的动画效果: 图片翻转。 在iOS中的章节中,我也介绍过类似的效果,如果感兴趣的话,请点击这里查看&#xff1a…

【原】页面跳转以及表单提交中有中文的解决办法

这两天一直碰到一个郁闷的问题,在对表单进行提交的时候,用户名是中文的,怎么测试都不通过, 今天上午突然想起来是不是因为中文字符编码的问题!经过测试,果然是因为这个问题! 现在把解决方法贴出来!呵呵&…

架构设计学习网址

http://learninghard.blog.51cto.com/all/6146675转载于:https://www.cnblogs.com/haiy/p/4155727.html

实验吧之NSCTF misc250

下载的是一个流,用wireshark打开,由于原题是这样的:小绿在学习了wireshark后,在局域网内抓到了室友下载的小东东0.0 你能帮他找到吗?说明我们应该重点关注http传送的东西: 这里面一共有四个http文件&#x…

西澳大学商科专业排名_澳洲西澳大学优势专业排名多少

澳洲西澳大学优势专业排名多少西澳大学农业和林业专业在2018年QS世界排名中排名第32西澳大学解剖学和生理学专业在2018年QS世界排名中排名第13西澳大学地球与海洋科学专业在2018年QS世界排名中排名第32西澳大学土木结构工程专业在2018年QS世界排名中排名第37西澳大学矿产和采矿…

基于SOUI开发的应用展示

本页面列出基于SOUI开发的产品 欢迎使用SOUI的朋友提供资源:setoutsoft#qq.com #-> U大师 http://www.udashi.com EiisysIM: 是一款为工作场景而设计的企业即时通讯软件, ,含PC版和手机版。具有完善的即时通讯、文件传输、语音通话等功能。通讯录由企…

供应商寄售库存管理_【论文解读】物流联合外包下库存管理模式对供应链运作的影响...

物流联合外包下库存管理模式对供应链运作的影响作者:冯颖,林晴,张景雄,张炎治目录 1 引言2 问题描述3 数学模型4 协调模型5 数值算例6 结论1 引言传统库存管理模式下,供应链中各节点企业的库存管理各自为政&#xff0c…

ViewState

因为现在的ASP.NET网站是基于http这种无状态协议的。大家应该都懂。 在ASP.NET的我们提交的一个页面,虽然看起来是一样的,但是他们本质上已经不是同一个页面了。而是我们现在看见的页 面获取了之前提交的那个页面的一些状态值。关于这点,到第…

查看自己Android设备分辨率

/*在Android中加入下面代码,用数据线连接上手机、运行下便知道自己Android设备的分辨率是多少了*/DisplayMetrics mDisplayMetrics new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);Log.i("Resolution",mDis…

python之布尔值——待补充……

61数据类型 633 3括号:{} [] () 3基本类型: int str bool 1:None 转载于:https://www.cnblogs.com/wjlv/p/10818455.html

SQLserver2000 实例管理工具

1、企业管理器是microsoft管理控制台(Microsoft management console)的一个插件。插件是运行在MMC中的部件、他不能独立运行,但必须包含着MMC中。企业管理器提供MMC形式的界面。像IIS、MTS也是MMC插件 2、查询分析器右边有模板选项卡,可以创建现成的模板…

linux设置nexus开机自启动_CentOS7配置nexus开机自启动

CentOS7配置nexus开机自启动新建nexus启动脚本进入/etc/init.d目录,新建脚本文件nexus// 进入/etc/init.d[rootlinux_maven etc]# cd /etc/init.d/// 新建脚本文件nexus[rootlinux_maven init.d]# vim nexus脚本内容:#!/bin/bash#chkconfig:2345 20 90#description:…

怎么看懂别人的代码

一,程序的结构及流程基本上是顺序,循环,选择。 二,业务数据---->对象形式(js-->{}, new function(){}/Java object) 业务流程---->传入参数,返回值。 流程可以先看作一步,然后再分为两步&#xff…

c语言6-2

#include<stdio.h> int main(){int a[3][3]{2,3,5,45,23,65,8,46,67};int s,t;sa[0][0]a[2][2]a[1][1];ta[0][2]a[1][1]a[2][0];printf("%d\n%d\n",s,t);return 0;} 转载于:https://www.cnblogs.com/p201821440019/p/10819405.html