黑马程序员技术交流社区
标题:
java中存在内存泄漏问题吗?请举例说明
[打印本页]
作者:
陈建华
时间:
2012-12-6 15:12
标题:
java中存在内存泄漏问题吗?请举例说明
java中存在内存泄漏问题吗?请举例说明
作者:
卍解
时间:
2012-12-6 20:40
Point rp1 = new Point(3,3);
Point rp2 = new Point(5,5);
Point rp3 = new Point(6,6);
HashSet set = new HashSet();
set.add(rp1);
set.add(rp2);
set.add(rp3);
rp2.y = 7;
set.remove(rp2);
System.out.println(set.size());
复制代码
rp2没有被删除,结果还是三。
当Hashset集合存储对象时,每添加一个元素都会先算出它的hashcode分段存储,也就是说对hashcode有一个映射。
因为Hashset中不能存储重复的对象,所以在添加一个元素时,需要对集合当中的元素进行equals比较,这个时候就会通过它的hashcode来判断这个hashcode所存储的区域是哪一块,然后再进入到那个区域去比较。这个时候就会造成内存泄漏
作者:
吴健
时间:
2012-12-7 22:38
本帖最后由 吴健 于 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 个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,
以前的引用自然消失!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2