Android面试准备:内存泄露和内存溢出

来源:互联网 发布:js 数组push 编辑:程序博客网 时间:2024/05/17 00:49

概念

  1. 内存泄露:申请的内存没有及时释放掉,这样的话就会造成程序能使用的内存资源越来越少,最终会导致系统无法再提供内存资源;
    譬如说,一个map里面一直在添加新的对象,这样的话就很有可能造成内存泄露。
  2. 内存溢出:就是要求分配的内存超出了系统提供的内存,系统不能满足要求,而产生了溢出。
    譬如说:你申请的是一个存放int类型的数据,却赋值给他一个long类型的数据。这就导致了内存溢出。

Java内存回收机制

  1. C++的内存回收机制:在C++ 里面,对内存资源的申请啊、使用啊、还有释放都需要程序员来负责。这样的话很有可能因为程序原忘了释放内存导致内存的泄露。
  2. Java 的话就提供了一个相应的内存回收机制——垃圾回收机制(GC:garbage collection)。
  3. Java中垃圾回收机制的原理是:当一个内存对象失去了所有的引用之后,GC 就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被 GC 回收。

内存泄露和溢出的几种情况

  1. 堆内存溢出(outOfMemoryError:java heap space)
    譬如说一些对象本来不需要占用堆内存空间了,但是它的引用一直存在,导致垃圾回收机制无法释放对象的占用空间。
  2. 方法区内存溢出(outOfMemoryError:permgem space)
    方法区主要存放的是类信息、常量、静态变量等, 所以如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出。
  3. 线程栈溢出(java.lang.StackOverflowError)
    线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误,一般线程栈溢出是由于递归太深或方法调用层级过多导致的。

避免内存溢出和内存泄露的几个注意事项

  1. 尽早释放无用对象的引用

  2. 使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域

  3. 尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收

  4. 避免在循环中创建对象

  5. 列表内容

开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值

0 0