关于Android中的内存溢出和内存泄漏的问题

关于Android中的内存溢出和内存泄漏的问题,第1张

概述①、内存溢出(outofmemory),是指程序在向虚拟机申请内存时,没有足够的内存空间可以供其使用,于是出现了outofmemory;比如申请了一个Integer,但是它存了long才能存下的数,那就是内存溢出了。②、内存泄漏(memoryleak),是指程序在申请内存后,无法释放已经申请的内存空间,一次的内存泄漏

①、内存溢出(out of memory),是指程序在向虚拟机申请内存时,没有足够的内存空间可以供其使用,于是出现了out of memory;比如申请了一个Integer,但是它存了long才能存下的数,那就是内存溢出了。
②、内存泄漏(memory leak),是指程序在申请内存后,无法释放已经申请的内存空间,一次的内存泄漏可以忽略掉,但是多次之后,内存的堆积后果会很严重,无论多少内存都会被占光。
③、内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生了溢出。
举个栗子:一个盘子只能装下5个苹果,而你却要装6个,结果掉在了地上不能吃了。这就是溢出。比如说栈,栈满时再进栈必定会产生空间溢出,此时叫上溢。栈空的时候再做退栈也会产生空间溢出,此时叫做下溢。就是分配的内存不足以放下数据项序列。这就是内存溢出。
④、内存泄漏是指你向系统申请分配内存进行使用,既进行了new *** 作。可是使用完了以后却不归还(delete),结果你申请到的内存你自己也不能再访问了(也许是你把它的地址弄丢了),系统也不能再次将它分配给需要的程序。

内存泄漏举栗:

1、androID数据库查询时会使用到cursor,但是在写代码的时候忘记close。或者因为代码逻辑问题导致close未被调用。
2、I/O数据流 *** 作,读写结束后没有关闭。
3、Bitmap使用后未进行recycle *** 作
4、使用ListvIEw时,复用convertVIEw
5、调用registerReceiver后未调用unregisterReceiver();
6、还有就是比较隐晦的Context泄漏。
可以看下面这段代码:

private static Drawable sBackGround;@OverrIDeprotected voID voID onCreate(Bundle state){super.onCreat();TextVIEw textvIEw= new TextVIEw(this);textvIEw.setText("Leaks are bad");if(sBackGround==null){sBackGround=getDrawable(R.drawable.large_bitmap);}textvIEw.setBackGroundDrawable(sBackGround);setContentVIEw(textvIEw);}

代码说明:在这段代码中,我们使用的是一个static的Drawable对象。这通常发生在我们调用一个drawable ,而其加载又比较耗时,不希望每次加载Activity都去创建这个drawable的情况。此时,使用static无疑是最快的代码编写方式,但是比较槽糕。当一个drawable被附加到vIEw时,这个vIEw被设置成这个Drawable的callback(通过调用Drawable.setCallBack()实现)。这就意味着,这个drawable拥有一个TextVIEw的引用,而textvIEw又拥有一个Activity的引用。这就导致了Activity在销毁后,内存不会被释放。

内存溢出举栗:

关于图片内存溢出的处理:
1、在内存引用上面做些处理,常用的有软引用和弱引用。
2、在内存中加载图片时直接在内存中做处理。如:边界压缩
3、动态回收内存
4、优化Dalvik虚拟机的堆内存分配
5、自定义堆内存大小。
在此附上有关性能优化的lint篇(郭霖大神的推送文章),帮助解决不必要的代码:
有关lint的使用

总结

以上是内存溢出为你收集整理的关于Android中的内存溢出和内存泄漏的问题全部内容,希望文章能够帮你解决关于Android中的内存溢出和内存泄漏的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1004343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存