java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足

内存泄露

什么是内存泄露?

在维基百科上的定义如图:

0973cb06ebba45a29b356c0adbc62ae4.jpg

中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存。

百度百科上的定义如图:

4a534dc65b90462388f1f15eee3fd92c.jpg

OWASP上的定义:

83145aa6e8a044578b4cea8c8e6f9f12.jpg

开发者无法释放某块不会再使用的内存。

用C语言解释一下,例如:

#include 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. */

}

程序中的指针a所指向的那块内存在函数退出后并没有释放。malloc申请的是堆内存,正常情况下,使用完后要调用free来释放该内存。

但是在java里面,java有垃圾收集器(Garbage Collection,GC),会自动收集垃圾,也就是不用的内存。所以,C语言里的情况,在java里不会出现,但是会有另外一种内存泄露的情况出现,例如:

Listlist = new ArrayList();

for (int i = 0; i < 100; i++) {

Object o = new Object();

list.add(o);

o = null;

}

此时,所有的Object对象都没有被释放,因为变量list引用这些对象。如果要释放这些对象,应该调用:‘

list.clear();

但是,如果程序一直没调用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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值