java的强软弱虚四种引用类型

4 篇文章 0 订阅
@AllArgsConstructor
@NoArgsConstructor
public class MyUser {

    private String username;
    private String password;

}

强引用

如果强引用对象一直在程序中持有,在垃圾回收时不会去释放清理,new 的对象都是强引用对象

示例代码:

public static void main(String[] args) throws Exception {
    //强引用对象的创建
    ArrayList list = new ArrayList();

    System.gc();
    System.out.println("普通垃圾回收时:");

    System.out.println("内存不够时:");
    ArrayList<Object> objects = new ArrayList<>();
    try {
        while (true){
            objects.add(new int[1024*1024*1024]);
        }
    }catch (Error e){
        System.out.println("强引用对象 --> "+ list);
    }
}

运行结果:

普通垃圾回收时:
强引用对象 myUser --> bean.MyUser@7cc355be

内存不够时:
强引用对象 myUser --> bean.MyUser@7cc355be

Process finished with exit code 0

软引用

当内存不足时,垃圾回收时会去释放清理软引用对象

示例代码:

public static void main(String[] args) throws Exception {
    //软引用对象的创建
    SoftReference<MyUser> myUserSoftReference = new SoftReference<>(new ArrayList());

    System.gc();
    System.out.println("普通垃圾回收时:");
    System.out.println("软引用对象 myUserSoftReference --> "+myUserSoftReference.get());

    System.out.println("内存不够时:");
    ArrayList<Object> objects = new ArrayList<>();
    try {
        while (true){
            objects.add(new int[1024*1024*1024]);
        }
    }catch (Error e){
        System.out.println("软引用对象 myUserSoftReference --> " + myUserSoftReference.get());
    }
}

运行结果:

普通垃圾回收时:
软引用对象 myUserSoftReference --> bean.MyUser@6e8cf4c6
内存不够时:
软引用对象 myUserSoftReference --> null

Process finished with exit code 0

弱引用

当垃圾回收时就会释放清理弱引用对象

示例代码:

public static void main(String[] args) throws Exception {
    //弱引用对象的创建
    WeakReference<MyUser> myUserWeakReference = new WeakReference<>(new ArrayList());

    System.gc();
    System.out.println("弱引用对象 myUserWeakReference --> "+myUserWeakReference.get());

    System.out.println("内存不够时:");
    ArrayList<Object> objects = new ArrayList<>();
    try {
        while (true){
            objects.add(new int[1024*1024*1024]);
        }
    }catch (Error e){
        System.out.println("弱引用对象 myUserWeakReference --> "+myUserWeakReference.get());
    }
}

运行结果:

普通垃圾回收时:
弱引用对象 myUserWeakReference --> null
内存不够时:
弱引用对象 myUserWeakReference --> null

Process finished with exit code 0

虚引用

不会影响对象生命周期,可以监控哪些对象被回收了

示例代码:

public static void main(String[] args) throws Exception {
    //虚引用对象的创建
    ReferenceQueue<MyUser> myUserReferenceQueue = new ReferenceQueue<>();
    PhantomReference<MyUser> myUserPhantomReference = new PhantomReference<>(new ArrayList(), myUserReferenceQueue);
    System.gc();
    System.out.println("普通垃圾回收时:");
    System.out.println("虚引用对象 myUserPhantomReference --> "+myUserPhantomReference.get());
    
    System.out.println("内存不够时:");
    ArrayList<Object> objects = new ArrayList<>();
    try {
        while (true){
            objects.add(new int[1024*1024*1024]);
        }
    }catch (Error e){
        System.out.println("虚引用对象 myUserPhantomReference --> "+myUserPhantomReference.get());
    }
}

运行结果:

普通垃圾回收时:
虚引用对象 myUserPhantomReference --> null
内存不够时:
虚引用对象 myUserPhantomReference --> null

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值