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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

java中存在内存泄漏问题吗?请举例说明

2 个回复

倒序浏览
  1. Point rp1 = new Point(3,3);  
  2. Point rp2 = new Point(5,5);  
  3. Point rp3 = new Point(6,6);  
  4. HashSet set = new HashSet();  
  5. set.add(rp1);  
  6. set.add(rp2);  
  7. set.add(rp3);  
  8.   
  9. rp2.y = 7;  
  10. set.remove(rp2);  
  11. System.out.println(set.size());  
复制代码
rp2没有被删除,结果还是三。
当Hashset集合存储对象时,每添加一个元素都会先算出它的hashcode分段存储,也就是说对hashcode有一个映射。
因为Hashset中不能存储重复的对象,所以在添加一个元素时,需要对集合当中的元素进行equals比较,这个时候就会通过它的hashcode来判断这个hashcode所存储的区域是哪一块,然后再进入到那个区域去比较。这个时候就会造成内存泄漏

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 吴健 于 2012-12-7 22:43 编辑

    所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java 中有垃圾回
收机制,它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾
回收器从内存中清除掉。 由于 Java 使用有向图的方式进行垃圾回收管理, 可以消除引用循环的
问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么 GC 也是可以回收它们
的。
   内存泄露的一种情况:当一个对象被存储进 HashSet 集合中以后,就不能修改这个对象中
的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进 HashSet 集合中时
的哈希值就不同了,在这种情况下,即使在 contains 方法使用该对象的当前引用作为的参数去
HashSet 集合中检索对象,也将返回找不到对象的结果,这也会导致无法从 HashSet 集合中单独
删除当前对象,造成内存泄露。
  还有例子如:
    public class Bad{
           public static Stack s=Stack();
           static{
                s.push(new Object());
                s.pop(); //这里有一个对象发生内存泄露
                s.push(new Object()); //上面的对象可以被回收了,等于是自愈了
          }
}
       因为是 static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如果你
的 Stack 最多有 100 个对象,那么最多也就只有 100 个对象无法被回收其实这个应该很容易理
解,Stack 内部持有 100 个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,
以前的引用自然消失!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

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