android内存溢出一般由哪些原因导致的
2个回答
2015-12-09 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
android中前饥信常有的内存溢出原因
一,大量位图的加载
有时候我们需要从网络上获取大量的图片并且展现在view中,但是如果图片较大,一次性加载大量Bitamap,那么程序可用内存会瞬间增长,引起OOM,通常的解决方法是开始不加载位图,设置BitmapFactory.Options的inJustDecodeBounds为true,先获取到宽高,这时候位图并不会加载到内存中,然后计算缩放比例再加载位图适应view控件,这样可以避免OOM的产生
二, Bitmap对象不在使用时调用recycle()释放内存
有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。
三, 查询数据库没有关闭游标
程序中经常会进行查询数据库的操肢厅作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
四,构造Adapter时,没有使用缓存的 convertView
以构造ListView的BaseAdapter为例,在BaseAdapter中提高了方法:
public View getView(int position, View convertView, ViewGroup parent)
来 向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的 view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构慧轮造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。
一,大量位图的加载
有时候我们需要从网络上获取大量的图片并且展现在view中,但是如果图片较大,一次性加载大量Bitamap,那么程序可用内存会瞬间增长,引起OOM,通常的解决方法是开始不加载位图,设置BitmapFactory.Options的inJustDecodeBounds为true,先获取到宽高,这时候位图并不会加载到内存中,然后计算缩放比例再加载位图适应view控件,这样可以避免OOM的产生
二, Bitmap对象不在使用时调用recycle()释放内存
有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。
三, 查询数据库没有关闭游标
程序中经常会进行查询数据库的操肢厅作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
四,构造Adapter时,没有使用缓存的 convertView
以构造ListView的BaseAdapter为例,在BaseAdapter中提高了方法:
public View getView(int position, View convertView, ViewGroup parent)
来 向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的 view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构慧轮造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
展开全部
模拟器羡野RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到Bitmap的或配时候,大小会变大,导致超出RAM内存,具体解决办法如下: //解决加载图片内存溢出的兄团喊问题
//Options只保存图片尺寸大小,不保存图片到内存
BitmapFactory.Optionsopts=newBitmapFactory.Options();
/*缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰*/
opts.inSampleSize=4;
Bitmapbmp=null;
//回收 bmp.recycle();
还可以用到优化Dalvik虚拟机的堆内存分配 对于Android平台来说,其托管层使用的DalvikJavaVM
从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用
//Options只保存图片尺寸大小,不保存图片到内存
BitmapFactory.Optionsopts=newBitmapFactory.Options();
/*缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰*/
opts.inSampleSize=4;
Bitmapbmp=null;
//回收 bmp.recycle();
还可以用到优化Dalvik虚拟机的堆内存分配 对于Android平台来说,其托管层使用的DalvikJavaVM
从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询