内存泄露与内存溢出

原创 2016年08月30日 22:03:01

1、内存泄露(Memory Leak)

内存泄露是指我们在使用动态存储时分配的空间,在使用后没有释放,这样导致内存单元没有被回收利用,这就是内存泄露。
这里写图片描述
在java中因为动态创建的对象是保存在堆中的,因此指的是堆内存泄露。

内存泄露在不严重的情况下不容易察觉,但在严重的情况下会导致导常产生:Out of Memory(内存溢出)

这里写图片描述

在java中内存泄露的场景:

1、静态集合类引起内存泄露

Static Vector v = new Vector(10); 
for (int i = 1; i<100; i++) 
{ 
Object o = new Object(); 
v.add(o); 
o = null; //o对象已经删除,但集合v没有办法被回收,从而可能引起内存泄露问题。
}// 

2、监听器

当我们给一个对象设置监听的时候,移除对象后,没有解除监听任务,导致内存泄露

3、没有关闭使用的资源

  1. 数据库连接
  2. 网络连接
  3. io流

2、内存溢出(Out of Memory)

内存溢出是指我给们程序分配的内存空间不足,导致内存溢出。在java中内存分配由程序完成,而内存的回收由GC(Garbarge Collection)管理。但GC只能回收无用不再被其他对象所占用的空间,而由于程序员调用不当导致的问题没有办法解决。因此,我们只有程序员良好的代码习惯,尽量释放不使用的内存空间。

这里写图片描述

通常导致内存溢出的原因

1、读取数据太大造成

比如从数据库中一次读取太多的内容,或者一次性给集合中添加特别多的内容。

2、集合中对象的引用,使用后没有清空

集合类中有对对象的引用,使用完后未清空,使得JVM不能回收

3、死循环

死循环可能直接导致内存溢出。

3、Android中内存溢出与内存泄露

Android由于分配的内存有限,这个问题就比java问题严重的多,稍有不当,便会产生OOM的导常。它产生的原因大致和java上述相同,但也有些android中比较特别的地方。内存泄露和内存溢出都可以导致OOM,因此可以从这两方面都进行分析。下面主要 列举在Android中产生内存溢出的场景

1、没有关闭使用的资源

和java中一样包括数据库,网络,IO流操作等。

2、静态变量使用不当

特别是activity中使用静态成员,导致 activity也没有办法回收

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);    
}   

3、Handler引起的内存泄露


public class MyActivity extends Activity {

  private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      // ... 
    }
  }
}

在activity中使用handler,如果activity已经回收,则handler执行完毕,更新UI时,Activity已经销毁了。

解决办法:Handler使用静态内部类

4、图片问题

  1. 图片太大—–压缩
  2. 图片没有释放资源,Bitmap没调用recycle()
  3. Android中listview,recyclerview的优化问题,也就是图片缓存问题,三级缓存

5、集合中对象没清理造成的内存泄露

比如ArrayList,和Map中在清空数据。如果是static修饰的话,问题会更加严重。

4、最后Android中内存检测工具

这里写图片描述

Java内存泄露与溢出的区别

Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽);而Java内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 Java内存泄露...
  • qq_27376871
  • qq_27376871
  • 2016年08月03日 09:19
  • 1947

Android 内存溢出和内存泄漏的区别

android 内存泄漏 内存溢出
  • u013435893
  • u013435893
  • 2016年01月29日 16:39
  • 5065

内存溢出和内存泄漏的区别,产生原因以及解决方案

一、概念与区别 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请 了一个integer...
  • ShanYu1198124123
  • ShanYu1198124123
  • 2016年09月02日 15:31
  • 9300

内存泄露,缓冲区溢出,堆破坏 的问题

今天在用c语言写socket的AES加解密的时候,由于是直接操作内存,错误百出,调了整整三天才把加解密的问题给搞出来。。。。整死我了。。。 总结一下,是自己使用malloc动态分配内存不当,没有掌握...
  • gaoxin1076
  • gaoxin1076
  • 2012年07月07日 16:52
  • 2835

Java内存泄露与溢出的区别

Java内存泄露与溢出的区别   你知道Java内存泄露与溢出的区别,这里和大家讨论一下,Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽);而Java内存溢...
  • zhang434
  • zhang434
  • 2013年12月31日 10:32
  • 909

Java内存泄露与溢出的区别

你知道Java内存泄露与溢出的区别,这里和大家讨论一下,Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽);而Java内存溢出就是你要求分配的内存超出了系统能给你...
  • jdbc
  • jdbc
  • 2014年11月19日 16:34
  • 517

JAVA内存泄露、溢出的检查方法、工具介绍

问题发现: 在我们运行的一个项目上线运营后发现运行两天左右就会报内存溢出,只有重启tomcat才能恢复服务,异常信息如下: java.lang.OutOfMemoryError: GC overh...
  • oceansky123
  • oceansky123
  • 2014年03月26日 17:32
  • 730

Android 内存泄露

  • 2015年03月13日 11:52
  • 77KB
  • 下载

android性能优化之内存泄露

  • 2017年10月13日 15:31
  • 2.73MB
  • 下载

检查代码内存泄露

  • 2017年10月20日 15:31
  • 559KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存泄露与内存溢出
举报原因:
原因补充:

(最多只允许输入30个字)