什么是内存泄露?
在维基百科上的定义如图:
中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存。
百度百科上的定义如图:
OWASP上的定义:
开发者无法释放某块不会再使用的内存。
用C语言解释一下,例如:
#include <stdlib.h> void function_which_allocates(void) { /* allocate an array of 45 floats */ float * a = malloc(sizeof(float) * 45); /* additional code making use of 'a' */ /* return to main, having forgotten to free the memory we malloc'd */ } int main(void) { function_which_allocates(); /* the pointer 'a' no longer exists, and therefore cannot be freed, but the memory is still allocated. a leak has occurred. */ }
但是在java里面,java有垃圾收集器(Garbage Collection,GC),会自动收集垃圾,也就是不用的内存。所以,C语言里的情况,在java里不会出现,但是会有另外一种内存泄露的情况出现,例如:
List<Object> list = new ArrayList<Object>(); for (int i = 0; i < 100; i++) { Object o = new Object(); list.add(o); o = null; }
list.clear();
所以,java和C里面的内存泄露是不一样的,区别:
C:没有指针指向不再使用的内存,故无法释放那块内存。
java:有引用指向不再使用的内存,但是并没有去释放那块内存。
英文叫memory overflow。与缓冲区溢出类似。比如,char ch[10],却输入11个char进去。
但是很多人直接把内存溢出当成内存不足了。
英文叫out of memory。申请内存时,没有足够的空间。
内存泄露最终会导致内存不足。
另外,可以参考IBM上的文章http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/