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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王程 中级黑马   /  2012-8-7 11:06  /  1973 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


Java内存发生泄漏之后对象占用的内存不能被JVM垃圾回收机制回收,那还能被其他机制回收吗?还是就永远浪费掉了,如果就浪费掉了,那如果次数发生多了不会造成内存溢出吗?

3 个回复

倒序浏览
java 的优点是虚拟机的垃圾自动回收,但有利就会有弊,全部由虚拟机处理之后,
就会出现小病不犯,一犯就是大病的情况,要么内存不泄露,要么泄漏了就没法处理。
所以不会有其他机制来回收。只能靠外部处理,通过一些专业工具获取jvm的信息分析内存
泄漏的原因,再对症下药。
回复 使用道具 举报
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。  
内存泄露的另外一种情况:当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。  

评分

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

查看全部评分

回复 使用道具 举报
首先要明确:Jvm内存区域的组成  分为: 栈 和 堆
栈中数据的生存期必须是确定的 所以不会发生溢出的状况
如果堆内存中发生内存溢出状况,建议使用JProfiler工具 监控系统内存使用情况 可以有效的监控垃圾回收,线程运行状况,监视Jvm运行情况及性能

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马