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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡建彪 黑马帝   /  2012-10-25 10:12  /  1489 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java类会造成内存的泄露吗?为什么?举例说明。

例如:Set set = new HashSet();
ReflectPoint rp = new ReflectPoint(3,4);//测试对象rp,根据其x,y属性来算出hashCode
set.add(rp);
如果现在不需要rp数据了,想从内存中删除掉该对象引用,可以用
set.remove(rp);
此时可以清理出内存空间。但是如果修改了hashCode生成的x,y属性:
rp.x = 66;
此时调用set.remove(rp);,则无法删除该对象引用,因为改变了x属性的值,其
hashCode也会改变,假如本来rp对象存放在A区域里面,hashCode一变,此时set.remove(rp)会从改变后的hashCode所对应的那个区域下寻找是否存在rp对象,存在就删除,而此时并不能找到,则不能删除掉,rp对象引用还会存放在内存中,占用内存空间,不被释放,造成内存的泄露。
建议:不要轻易修改用于生成hashCode的属性。

欢迎大神们多举几个例子。


评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

2 个回复

正序浏览
张忠豹 发表于 2012-10-25 10:22
在java里面,一般在操作文件的时候有关闭流的动作in.close( ),或者out.close( )之类的东西,其实它关闭的不 ...

Thanks for replying.
回复 使用道具 举报
在java里面,一般在操作文件的时候有关闭流的动作in.close( ),或者out.close( )之类的东西,其实它关闭的不是流对象,而是这个对象打开的相关资源。这个资源可以是内存或者其它的什么东西。如果不关闭,就会造成内存泄露。
在数据库中Connection的个数是非常重要的资源,一个数据库无论有多大,它的Connection的个数是有限的,此时,如果一个用户建立的connection连接,使用完之后,不释放Connection,如果用户过多,就会导致Connection的数据急剧下降。造成系统的崩溃。当然内存泄露也在其中。所以关闭资源的动作很重要。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

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