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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 14年7月想去it 初级黑马   /  2014-10-7 17:24  /  3509 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
Vector v = new Vector(5);   
for (int i = 1; i < 50; i++)   {   
         Object o = new Object();    
        v.add(o);    
        o = null;   
}

是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?


最佳答案

查看完整内容

“是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?” 这个不是的,一个对象只有在没有引用指向它的时候才可以被回收,而且这个回收的时间也不是固定的,什么时候回收必须要看垃圾回收器。 而且在你这个例子中,也并非是将o设置为null就可以的,因为在o被设置为null之前,实际上是存在着两个指向该对象的引用,一个是o,另一个存在于v里面,你只是将o设置为null,并没有达到让其能够回收的程度。 对 ...

14 个回复

倒序浏览
本帖最后由 水竹 于 2014-10-7 21:19 编辑

“是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?”

这个不是的,一个对象只有在没有引用指向它的时候才可以被回收,而且这个回收的时间也不是固定的,什么时候回收必须要看垃圾回收器。

而且在你这个例子中,也并非是将o设置为null就可以的,因为在o被设置为null之前,实际上是存在着两个指向该对象的引用,一个是o,另一个存在于v里面,你只是将o设置为null,并没有达到让其能够回收的程度。

对于v里面有指向那个对象的引用应该不难理解吧?因为如果引用不存在的话,那v要怎么对这个对象进行操作呢?

如果还是不理解的话我可以举一个例子:
  1. class Demo{
  2. public static void main(String[] args){
  3. Object o = new Object();
  4. function(o);
  5. o=null;
  6. }
  7. public static void function(Object o1){
  8. System.out.println(o1);
  9. }
  10. }
复制代码

在上面的代码中,当main方法调用function方法的时候,就是将对象的引用传递了过去,所以在调用之后,实际上o1和o都含有该对象的引用,只不过调用方法的时候方法执行完毕就释放了空间,o1就不存在了,而Vector却是一直都持有该对象的引用的。
回复 使用道具 举报
dsh 中级黑马 2014-10-10 22:40:59
藤椅
水竹 发表于 2014-10-7 21:16
“是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?”

这个不是的,一个对象 ...

想问问 你的这个代码图是怎么弄上去的  我每次都是复制   好麻烦
回复 使用道具 举报
dsh 发表于 2014-10-10 22:40
想问问 你的这个代码图是怎么弄上去的  我每次都是复制   好麻烦

那不是图,都是字,看到回复框上面有排按钮了么,就是字体加粗那一栏,倒数第二个“<>”,这个就是放代码的地方,点它然后把代码粘进去,你试试就知道了。
回复 使用道具 举报
dsh 中级黑马 2014-10-10 22:58:05
报纸
水竹 发表于 2014-10-10 22:53
那不是图,都是字,看到回复框上面有排按钮了么,就是字体加粗那一栏,倒数第二个“”,这个就是放代码的 ...

知道了  谢谢啊   解除了我好久的疑惑
回复 使用道具 举报
受教了,我也不会弄代码
回复 使用道具 举报
一楼已经解释的很好啦
回复 使用道具 举报
rel4x 中级黑马 2014-10-15 01:33:35
8#
受教了。。。
回复 使用道具 举报
受教了!!!
回复 使用道具 举报
针对楼主的问题,如果仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的,因此,如果对象加入到Vectorhou ,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。希望对楼主有所帮助!:)
回复 使用道具 举报
java有自动内存回收机制,如果你不用了的对象,系统会自动回收,而不像C语言等。
简单的说,如果C语言中你null也需要在free的,而在Java中你只是把他的指向设置成了空,
而不是释放了内存空间,就像链表一样,你删除了节点,还必须释放空间,而在Java中这个动作时自动的
回复 使用道具 举报
3-_-3 中级黑马 2014-10-19 19:40:30
12#
Java应该不会内存泄露吧
回复 使用道具 举报
皮三藏 来自手机 中级黑马 2014-10-23 16:13:14
13#
o=null只是意味着o这个引用指向null,而真正创建的Object对象还被v所引用,由于Object还被引用,所以GC在回收内存的时候不会回收掉,如果Object对象对程序已经没有任何作用,那么我们就认为这个程序发生了内存泄露
回复 使用道具 举报
cctao 中级黑马 2014-10-27 09:49:58
14#
Object o = new Object();//新创建一个object 对象,并且让o 指向它,此时新对象A的引用计数器为1
v.add(o);//这句过后 上面的对象A引用计数器为2
o=null;//取消o对对象A的引用,对象A的引用计数器为1,只有引用计数器的值为0,才不会造成内存泄露,这是我用IOS的思想解释的希望能帮到你
回复 使用道具 举报
我也遇到这个问题了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马