问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android studio 怎么检查内存溢出

发布网友 发布时间:2022-04-23 01:34

我来回答

1个回答

热心网友 时间:2023-10-10 06:46

  尽量不要使用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内存溢出的解决办法   转自:/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 JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static floatTARGET_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 时很容易内存溢出,报如下错误: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平台来说,其托管层使用的DalvikJavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final staticfloatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);即可。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 三鲜米线是哪三鲜 win7任务栏窗口预览功能没了 win7系统任务栏预览不能显示所有的窗口 重庆的三鲜米线是怎么做的哦? W7怎么设置预览窗口 上海话叫米线的蔬菜怎么做好吃? 关闭Win7中的任务栏窗口预览功能 在家做米线放什么蔬菜 win7窗口预览怎么设置 蔬菜米线的做法步骤图,蔬菜米线怎么做好吃 肉酱时蔬米线的做法,肉酱时蔬米线怎么做好吃 android 如何重写imageview 让图片有圆角效果 Android图片太多,而出异常,哪位高手给解决一下啊? 有人知道怎么解决安卓模拟器的内存溢出问题吗 winrar.是压缩软件?可我不会用?怎么用? 在Android开发中,有哪些好的内存优化方式 怎么防止imagecreatefromjpeg内存溢出 关于android里的 recycle()解释 Java如何读取文件夹中所有图片,并显示出来 android,程序中如何改变ImageView大小 win7窗口没有预览图是什么情况? 煮三鲜米线有那些蔬菜? android 怎样释放ImageView中的图片 如何制作u盘启动盘安装xp系统 求 做米线的配方 如何让win7的窗口预览功能显示全部窗口 如何实现让RecyclerView有不同尺寸的item 哪家过桥米线好? 怎么找回win7任务栏窗口预览功能 详细 win7任务栏上 窗口预览的时候 按键就没了 如何让窗口预览 一直显示 请问做米线,煮东西,做火锅。怎么调味儿?米线从哪里买?没煮过东西,直接买现成的底料还是那别的调味? 有一种泡面,一大桶里面有米线,面团和鸡蛋,这种泡面叫啥来着? WIN7旗舰版 任务栏 无法窗口预览 米线里的泡菜怎么腌制 如何调整win7系统中任务栏预览窗的大小 正宗桂林米粉与柳州螺蛳粉的配方是什么? win7窗口预览效果没有了 上海话“米线”是什么菜啊? 如何制作柳州螺蛳粉的汤料 win7系统鼠标移到到任务栏怎样显示窗口预览框