? ? ? ? 内存泄漏指的是存在“不再使用但持有引用”的对象,它们无法被GC回收,占用了内存的现象。轻微的内存泄漏不容易被察觉,严重的内存泄漏容易导致OOM(out of memory)。
?
class="java" name="code">Static List<Object> list = new ArrayList<>(100); for (int i = 1; i < 100; i ++) { Object o = new Object(); list.add(o); o = null;// 只清除了创建时指向该对象的引用,而集合中仍然持有该对象引用 }
?
// 以下这段代码基于 Person 对象重写了 hashCode() 方法 // 因为 HashSet 集合的删除是基于 Map 的,Set 集合中的对象在 Map 中 // 作为 key,而 Map(数组 + 链表)中 key 所在的数组的索引是根据 key // 的 hashCode() 计算的,当改变了 Set 中的对象,再用改变后的对象去 // 删除,自然是删除不掉的。 public static void main(String[] args) { Set<Person> set = new HashSet<Person>(); Person p1 = new Person("唐僧","pwd1",25); Person p2 = new Person("孙悟空","pwd2",26); Person p3 = new Person("猪八戒","pwd3",27); set.add(p1); set.add(p2); set.add(p3); System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素! p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变 set.remove(p3); //此时remove不掉,造成内存泄漏 set.add(p3); //重新添加,居然添加成功 System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素! }
?
其余略。
?
参考:?http://blog.csdn.net/wtt945482445/article/details/52483944
?
?
?