A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵亚威 中级黑马   /  2013-4-6 16:32  /  1331 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵亚威 于 2013-4-6 18:13 编辑

天天听人家说内存泄漏和内存溢出 但自己还是不太懂 那么它们有什么区别和相同之处呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
内存泄露是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况,重启计算机可以解决,但也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。 
内存泄漏可以分为4类:
1) 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2) 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3) 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4) 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
内存溢出简单的说就是,你加载的程序或文件大于了虚拟机所默认的内存就会造成内存溢出。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
内存溢出就是分配的内存不足以放下数据项序列。如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。

内存泄漏是指在堆上分配的内存没有被释放,从而失去对其控制。这样会造成程序能使用的内存越来越少,导致系统运行速度减慢,严重情况会使程序挂掉。

内存泄露与内存溢出的异同

同:都会导致应用程序运行出现问题,性能下降或挂起。

异: 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。
       内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
楼上的关于内存泄露总结的很全面了,我也长知识了。
内存溢出很好理解了,比如你向内存申请了1个字节的空间,但是你存入了2个字节的数据,就会内存溢出。
至于他们之间的联系,我觉得不是太大,内存泄露是导致内存溢出的原因之一,因为内存泄露积累起来将导致内存溢出。
回复 使用道具 举报
内存溢出和内存泄漏是两个不同的概念....
内存溢出是你要保存的数据的内存超出实际的内存就是导致溢出...
你把一个int型的东西转换成lang类型就不会溢出,
发过来就溢出了。因为lang是8个字节而int是四字节,把八字节的东西转换成四字节就出现内存溢出了。
你的代码在向内存申请一个内存空间后,一般情况下会随着代码运行的的结束被回收的。
而内存泄漏则是,代码运行完毕了,但是内存没有被回收。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得处理帖子哦~
回复 使用道具 举报
谢谢楼上的详细的回答 以前我老是混为一谈 现在明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马