黑马程序员技术交流社区

标题: java 内存泄漏问题 [打印本页]

作者: 刘江华    时间: 2011-10-13 10:12
标题: java 内存泄漏问题
请问Java中内存泄漏到底是怎么一回事。看视频的时候看不懂啊。求救。。
作者: 伍碧林    时间: 2011-10-13 10:33
{:soso__433253175740619224_2:}
按照哈希值放入集合的对象,修改后对象对应的哈希值就改变,之前按原来哈希值放入集合并分配的内存将无法释放,如果修改后在放入集合在修改在放入会很快用完内存,此为内存泄漏

老师是这样讲的....
作者: 许冉    时间: 2011-10-13 11:05
本帖最后由 xuan 于 2011-10-13 11:19 编辑

顾名思义,就是内存泄露就是内存减少了,当然这个减少并不是真正的内存大小变了
而是可用内存变小了,可能是由于对象未释放造成的
例如原来系统给程序分配的内存是2M,但是在运行过程中,有些对象已经没用了,但是它所占用的内存并没有被释放,这时候可用内存不就变少了嘛,这就是最简单的内存泄露理解
补充一句:之所以没有被释放,参考楼上楼下的例子
作者: 朱华    时间: 2011-10-13 11:12
纯手打,请区分。很久很久以前,老师说过JAVA不存在内存泄露,因为JAVA与C/C++不同,有着强大垃圾回收机制,只要一个对象不存在访问通路,即该对象在内存中占用了空间,但是不会被访问到,那他就会被垃圾回收器收回,但是后来在往上看东西时候慢慢发现,其实JAVA一样存在内存泄露,只不过这个泄露的范围要比C/C++小,要解释这个还是要引用那个经典的例子(关于这个例子的其他相关解释你可以在网上搜索的到):
  1. Vector v = new Vector();
  2. Object object = new Object();
  3. v.add(object);
  4. o = null;
复制代码
一步步分析这4行代码:
你创建了一个Vector,
然后你在栈中创建了一个引用object ,
又在堆中创建了一个实例new Object()
你将object引用放进了Vector中
然后又将object引用所占的内存释放掉了,o = null这句的本意其实是要释放o这个引用,从而让o连接着的object对象被垃圾回收器回收,但是因为你没清除Vector当中的引用信息,v依旧可以从自己的内部访问到object,所以object不满足垃圾回收机制,所以object的内存不会被释放,这就导致了内存泄露,不知道我说清楚没有。
内存泄露、内存溢出的情况有太多太多。。相信同类的实例网上一搜一大堆,很多都是实际开发中在应用其他开发技术的时候导致的。
作者: 陈云展    时间: 2012-11-6 09:19
朱华 发表于 2011-10-13 11:12
纯手打,请区分。很久很久以前,老师说过JAVA不存在内存泄露,因为JAVA与C/C++不同,有着强大垃圾回收机制 ...

请问。如果v=null这个内存不就释放了吗?




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