黑马程序员技术交流社区

标题: java中的内存泄露 [打印本页]

作者: 胡建彪    时间: 2012-10-25 10:12
标题: java中的内存泄露
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的属性。

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



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


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

Thanks for replying.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2