网上遇到一个关于java回收问题的思路

废话不多说,以下附代码:

import java.util.Iterator;
import java.util.Vector;

public class Test {
    int i;

    public static void main(String[] args) {
        Vector v = new Vector(10);
        for (int i = 1; i < 100; i++) {
            Test o = new Test();
            o.i = 11;
            v.add(o);//
            o.i = 10;
            o = null;
            //只是将对象指针设置为null,因为vector集合强引用了但是o指向的内存没有被回收,其实相当于new的o对象一直保持着集合里面有个指针指向了这个对象的内存空间
            if(o!=null){
                System.out.println("o.i=="+o.i);
            }
        }
        Iterator<Object> i = v.iterator();
        while (i.hasNext()) {
            System.out.println(String.valueOf(((Test) i.next()).i));
        }
    }
}

这儿打印的值:

10

10

....

在网上看到这个别人提问题后,自己回想了下java的回收,将对象置于null,其实只是建议我们的jvm虚拟机如果没有其他对象强引用它,它将会被jvm回收。

这儿问题

 o = null;

但是o给装在了集合,其实集合里面也会有有一个对应地址,或者说指针,可能说的不太严格,指向了这个内存,所以这时候jvm是不会回收对象o,只是o这个存在栈里面的变量可能会很快被回收。

所以打印出来的值 对象的i值一定是存在的。

从另外个角度说,集合的生命周期比装在集合里面的对象obj生命周期长,只有集合被置为null,被回收后,里面的对象才会真正被回收。

很小的问题,不过对于我们理解java的强应用和回收问题是有收获的。

有什么说的不对的问题,还请各位看官多多提问。

 

转载于:https://my.oschina.net/u/3318187/blog/1646652

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值