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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马胜平 中级黑马   /  2012-2-19 19:36  /  1848 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java中有没有内存泄漏的问题,谁碰到过举个例子

3 个回复

倒序浏览
- -递归不能随便乱用

void fun()
{
fun();
}
回复 使用道具 举报
肯定有咯。

这是代码:
                InputStream in = ReflectTest2.class.getResourceAsStream("config.properties");
                Properties props = new Properties();
                props.load(in);
                in.close();
                String className = props.getProperty("className");
                Collection collections = (Collection)Class.forName(className).newInstance();
         // Collection collections = new HashSet();

          Person1 p = new Person1(3,3);
          Person1 p1 = new Person1(5,5);
          Person1 p2 = new Person1(3,3);
          collections.add(p);
          collections.add(p1);
          collections.add(p2);
          collections.add(p);
         
          p.height = 7;
          //collections.remove(p);   //不管是否移除p,这个集合的长度都是2,这就造成内存泄漏
          System.out.println(collections.size());

当一个对象被存储进HashSet集合中以后,就不能再去修改这个对象中的那些参与计算哈希值的字段,否则就会造成了内存泄漏。

评分

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

查看全部评分

回复 使用道具 举报
java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。集合类,集合类仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。这一点其实也不明确,这个集合类如果仅仅是局部变量,根本不会造成内存泄露,在方法栈退出后就没有引用了会被jvm正常回收。而如果这个集合类是全局性的变量(比如类中的静态属性,全局性的map等即有静态引用或final一直指向它),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减,因此提供这样的删除机制或者定期清除策略非常必要。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马