黑马程序员技术交流社区

标题: 内存泄露和溢出 [打印本页]

作者: 杨剑    时间: 2013-1-31 12:39
标题: 内存泄露和溢出
本帖最后由 张向辉 于 2013-2-15 20:18 编辑

求解答,什么是内存泄露和内存溢出呢?
作者: 陈科宇    时间: 2013-2-1 17:49
      内存溢出,简单地讲,就是内存不够用。形象地讲,就是你的程序是5升水,而计算机的剩余水容量是3升了,你把5升水倒进3升水的空间里,肯定是不能装下的,那么你的程序也就不能正常运行。
作者: 陈科宇    时间: 2013-2-1 17:54
      内存泄露,可以说是程序运行时对内存没有有效管理发生的意外。内存是计算机中很紧张的资源。当一个程序申请的部分内存空间在某个时间段里都不再使用的时候,就应该还给计算机,操作系统便于及时调度该空间给其他程序使用。如果程序申请的空间使用后再不需要时不及时回收,就可能导致该程序在运行时占用的内存无限增长,使这部分不再使用的内存空间失去控制,影响操作系统正常分配调度内存空间。
作者: 杨剑    时间: 2013-2-3 07:54
非常感谢帮忙,应该明白了,我希望可以通过一个例子拉说明下内存溢出和泄露
作者: 王昕    时间: 2013-2-3 12:37
例子:内存溢出就像鱼缸里养鱼,鱼缸不够大,养的鱼太多,鱼都蹦出来了,可能是食人鱼,如果是食人鱼(还能在陆地上攻击人那种)就会捣乱。内存泄漏就是鱼缸里的鱼死了,还不把它捞出来扔了,让它在鱼缸里占地方。
作者: 李洪因    时间: 2013-2-3 14:31
内存泄露是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况,重启计算机可以解决,但也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。
内存溢出就是你要分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
当被分配的对象可达但已无用(未对作废数据内存单元的引用置null)即会引起。
         如:
Java代码  
1.        Vector v=new Vector(10);   
2.        for (int i=1;i<100; i ) {   
3.            Object o=new Object();   
4.            v.add(o);   
5.            o=null;   
6.        }   
7.        // 此时,所有的Object对象都没有被释放,因为变量v引用这些对象。   
8.        // 对象加入到Vector后,还必须从Vector中删除,最简单释放方法就是将Vector对象设置为null。   

作者: 陈科宇    时间: 2013-2-3 15:02
如果你想是用实例来证明,我先好好看看有没有比较形象的例子,然后给你回复。
作者: 王宝生    时间: 2013-2-4 11:36
内存泄露是特指“堆”的,当在堆上创建一个对象,而忘了释放就发生了所谓的内存泄露,在c/c++中经常发生,在java中一般不经常发生,因为有垃圾回收嘛。

内存异常一般发生在堆栈,但也可以发生在堆中。简单的说就是本来应该使用4字节内存,但是你却使用了5字节,那么超出的那一字节就会覆盖其他内存,这就是内存溢出。
   
作者: 王宝生    时间: 2013-2-4 11:37
最后在说一点,内存泄露之后,在进程结束之后,操作系统会回收所有资源,所以不用担心你的程序结束之后,还会有内存没有释放




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2