java对象的引用类型

  • 强引用对象:

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

  • 软引用对象:

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

  • 弱引用对象:

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

  • 虚引用对象:

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

例:

@AllArgsConstructor
@NoArgsConstructor
public class MyUser {

    private String username;
    private String password;

}
public static void main(String[] args) throws Exception {
    //强引用对象的创建
    MyUser myUser = new MyUser();
    //软引用对象的创建
    SoftReference<MyUser> myUserSoftReference = new SoftReference<>(new MyUser());
    //弱引用对象的创建
    WeakReference<MyUser> myUserWeakReference = new WeakReference<>(new MyUser());
    //虚引用对象的创建
    ReferenceQueue<MyUser> myUserReferenceQueue = new ReferenceQueue<>();
    PhantomReference<MyUser> myUserPhantomReference = new PhantomReference<>(new MyUser(), myUserReferenceQ
    System.gc();
    System.out.println("普通垃圾回收时:");
    System.out.println("强引用对象 myUser --> "+myUser);
    System.out.println("软引用对象 myUserSoftReference --> "+myUserSoftReference.get());
    System.out.println("弱引用对象 myUserWeakReference --> "+myUserWeakReference.get());
    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("强引用对象 myUser --> "+myUser);
        System.out.println("软引用对象 myUserSoftReference --> "+myUserSoftReference.get());
        System.out.println("弱引用对象 myUserWeakReference --> "+myUserWeakReference.get());
        System.out.println("虚引用对象 myUserPhantomReference --> "+myUserPhantomReference.get());
    }
}

结果:

普通垃圾回收时:
强引用对象 myUser --> bean.MyUser@7cc355be
软引用对象 myUserSoftReference --> bean.MyUser@6e8cf4c6
弱引用对象 myUserWeakReference --> null
虚引用对象 myUserPhantomReference --> null
内存不够时:
强引用对象 myUser --> bean.MyUser@7cc355be
软引用对象 myUserSoftReference --> null
弱引用对象 myUserWeakReference --> null
虚引用对象 myUserPhantomReference --> null

Process finished with exit code 0
posted @ 2022-03-07 18:04  叕叕666  阅读(38)  评论(0)    收藏  举报