java强引用-软引用-弱引用-虚引用

  • 强引用:普通的引用,强引用指向的对象不会被回收;
  • 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收;
  • 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。
  • 虚引用:在任何时候都可能被垃圾回收器回收。
虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,
如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

例子:

package com.example.demo.thread;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * java强引用-软引用-弱引用
 * 强引用:普通的引用,强引用指向的对象不会被回收;
 * 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收;
 * 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。
 * @author zhangming
 * @version 1.0
 * @date 2019-12-23 18:53
 */
public class WeakRefDemo {
    public static void main(String[] args) {
        Object a = new Object();
        Object b = new Object();
        Object c = new Object();
        Object d = new Object();

        //强引用
        Object strongA = a;
        //软引用
        SoftReference<Object> softB = new SoftReference<>(b);
        //弱引用
        WeakReference<Object> weakC = new WeakReference<>(c);
        //虚引用
        ReferenceQueue queue = new ReferenceQueue();
        PhantomReference prD = new PhantomReference(d,queue);

        a = null;
        b = null;
        c = null;
        d = null;

        System.out.println("Before gc...");
        System.out.println(String.format("strongA = %s, softB = %s, weakC = %s,prD = %s", strongA, softB.get(), weakC.get(),prD.get()));
        System.out.println("Run GC...");
        System.gc();

        System.out.println("After gc...");
        System.out.println(String.format("strongA = %s, softB = %s, weakC = %s,prD = %s", strongA, softB.get(), weakC.get(),prD.get()));

    }
}

执行结果:

Before gc...
strongA = java.lang.Object@3d646c37, softB = java.lang.Object@41cf53f9, weakC = java.lang.Object@5a10411,prD = null
Run GC...
After gc...
strongA = java.lang.Object@3d646c37, softB = java.lang.Object@41cf53f9, weakC = null,prD = null

总结

引用类型被垃圾回收时间用途生存时间
强引用从来不会对象的一般状态JVM停止运行时终止
软引用当内存不足对象缓存内存不足时终止
弱引用正常垃圾回收时对象缓存垃圾回收后终止
虚引用正常垃圾回收时跟踪对象的垃圾回收垃圾回收后终止
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值