强引用 软引用 弱引用 虚引用

本文通过Java代码实例,详细阐述了垃圾回收机制在不同引用类型(强引用、软引用、弱引用、虚引用)下的表现,揭示了垃圾回收执行的不确定性,并通过测试方法展示了如何使用`finalize()`方法监控垃圾回收过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

From : http://supben.iteye.com/blog/1167736


测试对象

public class Obj {  
  
    private final String name;  
  
    public Obj(String name) {  
        this.name = name;  
    }  
  
    @Override  
    protected void finalize() throws Throwable {  
        System.out.println("执行finalize方法" + name);  
        super.finalize();  
    }  
  
    @Override  
    public String toString() {  
        return name;  
    }  
}

测试类

    import java.lang.ref.PhantomReference;  
    import java.lang.ref.ReferenceQueue;  
    import java.lang.ref.SoftReference;  
    import java.lang.ref.WeakReference;  
      
    public class Test {  
      
        public static void main(String[] args) {  
            // hardTest();  
            softTest();  
            // weakTest();  
            // phanTest();  
        }  
      
        public static void hardTest() {  
            Obj hard = new Obj("hard");  
            hard = null;  
            System.gc();  
            System.out.println(hard);  
        }  
      
        public static void softTest() {  
            SoftReference<Obj> soft = new SoftReference<Obj>(new Obj("soft"));  
            System.gc();  
            System.out.println(soft.get());  
        }  
      
        public static void weakTest() {  
            WeakReference<Obj> weak = new WeakReference<Obj>(new Obj("soft"));  
            System.gc();  
            System.out.println(weak.get());  
        }  
      
        public static void phanTest() {  
            ReferenceQueue<Obj> rq = new ReferenceQueue<Obj>();  
            PhantomReference<Obj> phan = new PhantomReference<Obj>(new Obj("phan"), rq);  
            //这里没有调用system.gc();  
            System.out.println(phan.get());  
        }  
    }

测试环境:jdk1.6。
System.gc()表示建议JVM 进行垃圾回收,JVM 未必会执行。我们可以根据 thinking in java说的那样,用finalize()来监控他的执行。

上面4个方法的运行结果分别是
1.null
  执行finalize方法hard
或者
  执行finalize方法hard
  null
两者出现的比例大约为5:1

2.soft

3.null
  执行finalize方法weak
或者
  执行finalize方法weak
  null
两者出现的比例大约为3:1

4.null


结论:1.显式的把(强引用)对象置为null,会大大加大 垃圾回收执行频率。几乎只要我们给出建议,jvm就会回收。
2.对于软引用,如果不显式的置为null的话,和强引用差不多,垃圾回收不会执行。只会等到内存不足的时候才会执行。
3.对于弱引用,就算你不显式的把他置为null,垃圾回收也会立即执行。
4.虚引用,相当于null,不解释。

5.垃圾回收执行的时机是不可预知的。3和4的打印结果很好的说明了这点。

6.务必要注意到一个事实,本例子的结果是在app中只有一个对象运行的情况下得到的。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值