一、内存泄漏
内存泄漏(Memory leak):是指程序在申请内存后,无法释放已申请的内存空间。
一般我们说的内存泄漏是指堆内存的泄漏,堆内存是指程序从堆中分配的,大小任意的,使用完成之后必须显式释放内存。应用程序一般使用malloc,reloc,new等函数从堆中分配到一块内存块,使用完成后,程序必须负责相应的释放,在C中使用free(),在C++中使用free() delete delete[] ,而java中由于垃圾回收机制不用手动释放。
如果内存不能释放,这块内存就不能再次使用,我们就说这块内存泄漏了。
二、内存溢出
内存溢出(out of memory):程序要求的内存,超出了系统所能分配的范围,如:我们使用一个int型4字节的数据来装一个float型8字节的数据,就会产生内存溢出。不过我们可以在编程时强制转换int
三、内存泄漏分类
1、常发性内存泄漏,发生内存泄漏的代码会被多次执行到,每次被执行的之后都会导致一块内存泄漏
2、偶发性内存泄漏,发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的,对于特定的环境,偶发性的也也许就变成了常发性的,所以测试环境和测试方法对检测内存泄漏至关重要。
3、一次性内存泄漏,发生内存泄漏的代码只执行一次,或者由于算法上的缺陷,会导致总会有一块仅且一块内存发生泄漏。比如:在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4、隐式内存泄漏,程序在运行过程中不停的分配内存,但是知道结束的时候才释放内存,严格的说并没有发生内存泄漏,因为最终程序释放了所有申请的内存,但是对于一个服务器程序,需要运行几天、几周甚至几个月,不及时释放内存也可能导致最终耗尽吸引的所有内存,我们称这类内存泄漏为隐式内存泄漏。
四、java中存在垃圾回收机制,为什么还会有内存泄漏?
java是支持垃圾回收机制的,在这样的一个背景下,内存泄漏又被称为“无意识的对象保持”,如果一个对象引用被无意识的保留下来,那么垃圾回收器不仅不会处理这个对象,而且也不处理被这个对象引用的其他对象,“内存泄漏”就是内存中某些内存不可被回收。
eg:如果对一个栈(Stack类)先是进行入栈操作,之后再进行出栈操作,那么弹出来的对象将不会被当做垃圾回收,即使使用栈的客户程序不再引用这些对象,因为栈内部存在着对这些已弹出对象的引用,这是Stack类自己管理内存的机制所决定的。