定义
- 内存溢出out of memory:指程序运行过程中无法申请到足够的内存而导致的一种错误;
- 内存泄露memory leak:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收始终占用内存;即被分配的对象可达但已无用
内存溢出:
- 堆内存溢出(outOfMemoryError:java heap space)
- 方法区内存溢出(outOfMemoryError:permgem space)
- 线程栈溢出(java.lang.StackOverflowError)
内存泄漏可以分为4类:
- 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
- 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
- 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
- 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏
java可能出现的内存溢出
1、在循环体内New大量的对象; 2、存在对象的引用,使用完后没有清除,导致JAVA虚拟机不能回收; 3、在内存中加载了大量的数据或缓存了过多的数据;