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

© randee_jia 中级黑马   /  2014-7-24 10:32  /  799 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是内存泄漏:
它是指,在Java内存中存在一些对象,而且这些对象已经不再使用,但还是贮留在内存中没有被释放。
例如:
//Collection collections= new ArrayList();
                Collection collections= new HashSet();
                ReflectPoint pt1=new ReflectPoint(3,3);
                ReflectPoint pt2=new ReflectPoint(5,5);
                ReflectPoint pt3=new ReflectPoint(3,3);
               
                collections.add(pt1);
                collections.add(pt2);
                collections.add(pt3);
                System.out.println(collections.size());//此时是2
                pt1.y=7;
                collections.remove(pt1);
                System.out.println(collections.size());//前面已经删除一个pt1,但是集合的大小还是2
在上述代码中,集合collections中共新增了3个对象,分别为pt1,pt2,pt3。但根据pt1和pt3在此集合中看作是一个对象,此时集合的大小为2,在更该pt1.y=7后,接着又删除pt1对象,理论上讲集合大小应该变成1,但实际打印出的值为2,为什么呢?因为更改了y的值,而y又参与了hashcode方法的运算,所以前后计算的哈希码不一致,所以哈希算法到不同的区域内寻找pt1对象,也就是说remove方法没有去pt1对象之前存在的那个哈希区域找pt1,而是在新的哈希值所对应的区域去寻找pt1对象,因此不能找到pt1对象,也就不能删除pt1对象,但既然想删除pt1.说明对象pt1已经无用,但它还贮留在内存中占用内存空间,所以出现了内存泄漏。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马