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

①、内存溢出(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;
@Override
protected 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的使用

上一篇:java-测试方法而不初始化类


下一篇:anyHouse-iOS 高仿ClubHouse