内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
内存溢出常见原因:
1.内存加载的数据量过于庞大,如一次性从数据库取出过多数据。
2.集合类中有对象的引用,使用完后未清空,使得JVM不能回收。
3.代码中存在死循环或循环过多重复的对象实体。
4.使用的第三方软件中的BUG。
5.启动参数内存值设定过小。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。
内存泄露分为4类:
1.常发性内存泄露:发生内存泄露的代码多次被执行到,每次执行的时候都会导致一块泄露。
2.偶发性内存泄露:发生内存泄露的代码只有在特定环境或操作过程下才会发生。常发性和偶发性是相对的,对于特定的环境,偶发性或许就变成常发性的,所以测试环境和测试方法对内存泄漏至关重要。
3.一次性内存泄露:发生内存泄露的代码只会被执行一次,或者由于逻辑上的缺陷,导致总有一块发生泄露。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄露只会发生一次。
4.隐式内存泄露:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格来说这里没有发生内存泄露,因为程序最终释放了所有的申请内存,但是对于一个服务器程序,需要运行几天,几周或者几个月,不及时释放内存也可能导致最终损耗所有内存。所以,我们称这类内存泄露为隐式内存泄露。