博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android随笔]内存泄漏以及内存溢出
阅读量:5838 次
发布时间:2019-06-18

本文共 1956 字,大约阅读时间需要 6 分钟。

名词解释     

      内存泄漏:memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏危害能够忽略,但内存泄漏堆积后果非常严重,不管多少内存,迟早会被占光。

      内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。比方申请了一个Integer,但给它存了Long才干存下的数。那就是内存溢出。除此之外,也有一次性申请非常多内存。比方说一次创建大的数组或者是加载一个大文件如图片。非常多时候是图片的处理不当。

      memory leak 会终于导致out of memory!

内存泄漏举例

1。Android数据库查询时会使用Cursor。可是在写代码时。常常会有人忘记调用close,或者由于代码逻辑问题导致close未被调用。

2。I/O数据流操作,读写结束后没有关闭。

3,Bitmap使用后未调用recycle();

4,调用registerReceiver后未调用unregisterReceiver().

5,还有种比較隐晦的Context泄漏

先让我门看一下下面代码:

private static Drawable sBackground;    @Override    protected void onCreate(Bundle state) {        super.onCreate(state);        TextView label = new TextView(this);        label.setText("Leaks are bad");        if (sBackground == null) {            sBackground = getDrawable(R.drawable.large_bitmap);        }        label.setBackgroundDrawable(sBackground);        setContentView(label);    }

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

解决方式:Avoiding Memory Leaks 文章提到

In summary, to avoid context-related memory leaks, remember the following:

1。Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
2。Try using the context-application instead of a context-activity
3。Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solutionto  this issue is to use a static inner class with a  to the outer class, as done in  and its W inner class for instance
4,A garbage collector is not an insurance against memory leaks

一些避免内存泄漏的点能够看看

内存溢出举例

1,一次性载入一个大文件如图片,载入大图片的解决方式[Android随笔]怎样有效载入显示图片

2,使用List View、GridView在一个屏幕上显示多张图片

转载地址:http://qyjcx.baihongyu.com/

你可能感兴趣的文章
Kconfig的格式
查看>>
关于Cursor的moveToFirst和moveToNext的意义
查看>>
个人--工资划分5份
查看>>
有关文件下载的文件名
查看>>
史上最详细的wamp配置虚拟域名步骤
查看>>
oracle 授权
查看>>
lv扩展磁盘空间
查看>>
java8之stream流的基本操作
查看>>
二维数组计算协方差java
查看>>
SpringBoot下Redis相关配置是如何被初始化的
查看>>
为你的AliOS Things应用增加自定义cli命令
查看>>
MongoDB 创建基础索引、组合索引、唯一索引以及优化
查看>>
百度PaddlePaddle常规赛NLP赛道火热开启
查看>>
稳了!这才是cookie,session与token的真正区别
查看>>
python项目实战:制作一个简易的GUI界面浏览器
查看>>
OSChina 周二乱弹 —— 假期余额已不足!
查看>>
前端那些事之React篇--helloword
查看>>
ios的google解析XML框架GDataXML的配置及使用
查看>>
netty-当一个客户端连接到来的时候发生了什么
查看>>
PHP_5.3.20 源码编译安装PHP-FPM
查看>>