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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 月黑风高 于 2013-9-1 13:57 编辑

哪位大神能详细说明关于“内存泄露”的问题?通俗点讲解一下。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 范龙波 于 2013-9-1 13:55 编辑

先理解什么是内存泄露:
一个不再被程序使用的对象或变量一直占据内存
什么情况下会出现内存泄露:
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收
eg:  一个对象obj 存入到一个全局map对象中  ,一直不去使用这个obj,那么obj一直被缓存引用,但却不再被使用
如何检查java中的内存泄露
一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。
在补充一点
内存泄露的两个条件:无用,无法回收
static ,被它修饰的成员直到程序退出它才灭亡,所以它引用的对象很有可以发生内存泄露
还有另一种情况,当元素储入到了HashSet中,一旦修改成员属性,就有可能发生. 原因:集合所持有的hashcode找不到目标对象


评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
补充
内存泄漏分类 
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。    
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。    
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅一块内存发生泄漏。比如,在一个Singleton类的构造函数中分配内存,在析构函数中却没有释放该内存。而Singleton类只存在一个实例,所以内存泄漏只会发生一次。    
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马