java的四种引用

  1. java 中的引用分为 4种

1.强引用 引用存在就不会被GC *

2.软引用 heap memory(堆内存)满了就会被GC掉 *

3.弱引用 每次GC就会回收掉(应用有:ThreadLocal) *

4.虚引用 每次GC就会回收掉(应用有,控制jvm外的内存) */

  1. demo1 强引用案例1
public class ReferenceDemo {
    @Override
    protected void finalize()  throws Throwable{
        System.out.println( "ReferenceDemod对象死亡了");
    }
}


/**
 * 1.强应用就是我们平常的引用
 * 引用存在就不会被回收  引用!=null
 */
public  static   void   strongReference(){
    ReferenceDemo referenceDemo = new ReferenceDemo();
    System.out.println("1.引用是否存在"+referenceDemo);
    sleepThread(1000);
    System.gc();
    System.out.println("2.引用是否存在"+referenceDemo);
    sleepThread(1000);
    referenceDemo=null;
    System.gc();
    System.out.println("3.引用是否存在"+referenceDemo);

}

执行结果是:

1.引用是否存在
com.gyj.study.referece.ReferenceDemo@1b6d3586

2.引用是否存在
com.gyj.study.referece.ReferenceDemo@1b6d3586

3.引用是否存在null

ReferenceDemod对象死亡了

2、软引用 SoftRefernce 当heap memory 满了就会被GC回收掉;

/**
 * 2.软引用:heap momory 堆内存满了就会被GC回收掉;
 */
public static void softReference(){
    // 设置 jvm的内存为20m
    SoftReference sr= new SoftReference(new byte[1024 * 1024*10]);
    // 软引用对象 st---强引用--> 软引用实例---- 软引用----> 学习引用对象    学习对象比软引用 引用着,heap momory满了GC就会回收掉 学习引用对象(销毁)
    System.out.println("1 软引用类 引用 st :"+sr);

    System.out.println("1 byte[]引用类 引用  :"+sr.get());
    System.gc(); //垃圾回收
    System.out.println("2 软引用类 引用 st :"+sr);
    System.out.println("2 byte[]引用类 引用  :"+sr.get());

    byte[] bytes = new byte[1024 * 1024 * 11];

    System.out.println("3 软引用类 引用 st :"+sr);
    System.out.println("3 byte[]引用类 引用  :"+sr.get());

}

打印结果:

1 软引用类 引用 st :
java.lang.ref.SoftReference@1b6d3586

1 byte[]引用类 引用 :[B@4554617c

2 软引用类 引用 st :
java.lang.ref.SoftReference@1b6d3586

2 byte[]引用类 引用 :[B@4554617c

3 软引用类 引用 st :
java.lang.ref.SoftReference@1b6d3586

3 byte[]引用类 引用 :null (已经被GC回收掉了)

3 弱引用 WeakReference 弱应用引用的对象,每次GC都会回收掉! (应用场景有ThreadLocal)

/**
 * 3.弱引用:每次GC就回收掉;
 */
public static void  weakReference(){
    WeakReference wr = new WeakReference(new ReferenceDemo());
    // 弱引用对象 wr---强引用--> 弱引用实例---- 弱引用----> 学习引用对象    学习对象实例用弱引用引用着,每次GC就会回收掉 学习引用对象(销毁)
    System.out.println("1.引用是否存在"+wr);
    System.out.println("1.学习引用对象 是否存在"+wr.get());

    sleepThread(1000);
    System.gc();
    System.out.println("2.引用是否存在"+wr);
    System.out.println("2.学习引用对象 是否存在"+wr.get());

}

打印结果:

1.引用是否存在
java.lang.ref.WeakReference@1b6d3586

1.学习引用对象 是否存在
com.gyj.study.referece.ReferenceDemo@4554617c

2.引用是否存在
java.lang.ref.WeakReference@1b6d3586

2.学习引用对象 是否存在null

ReferenceDemod对象死亡了 (GC异步回收!)

4.虚引用 phantomReference 弱应用引用的对象,每次GC都会回收掉! (应用场景有ThreadLocal)并且GC回收钱也获取不到


public static void phantomReference(){
    ReferenceQueue referenceQueue = new ReferenceQueue();
    PhantomReference pr = new PhantomReference(new ReferenceDemo(),referenceQueue);
    // 虚引用对象 pr---强引用--> 虚引用实例---- 虚引用----> 学习引用对象    学习对象实例用虚引用引用着,每次GC就会回收掉 学习引用对象(销毁)
    //虚用获取不到
    System.out.println("1.引用是否存在"+pr);
    System.out.println("1. Queue:"+referenceQueue.poll());
    System.out.println("1.学习引用对象 是否存在"+pr.get());

    sleepThread(1000);
    System.gc();
    System.out.println("2.引用是否存在"+pr);
    System.out.println("1. Queue:"+referenceQueue.poll());
    System.out.println("2.学习引用对象 是否存在"+pr.get());
    
}

结果:

1.引用是否存在
java.lang.ref.PhantomReference@1b6d3586

  1. Queue:null

1.学习引用对象 是否存在null

2.引用是否存在
java.lang.ref.PhantomReference@1b6d3586

  1. Queue:null

2.学习引用对象 是否存在null

ReferenceDemod对象死亡了

最后总结:

* java 的引用分为4中
* 1.强引用   引用存在就不会被GC
* 2.软引用   heap memory(堆内存)满了就会被GC掉
* 3.弱引用   每次GC就会回收掉(应用有:ThreadLocal)
* 4.虚引用   每次GC就会回收掉(应用有,控制jvm外的内存)

相关文章

如何理解java基础中的Reference和引用类型?

首先要大致了解 Java 的几种引用类型。如下图所示,JDK 1.2 之后新增了 Reference 的概念,给开发人员提供了与 GC 交互的一种渠道。《深入理解 Java 虚拟机》中对于几种引用类型...

详细介绍一下Java中的什么是值传递?什么是引用传递?

Java中的参数传递是通过值传递进行的,即使是对象也是遵循这个规则,想要了解这个原理,首先我们就需要了解什么是值传递,什么是引用传递?值传递值传递是在调用方法的时候,方法接收到的参数是实际参数的一个副...

Java 值传递详解

开始之前,我们先来搞懂下面这两个概念:形参&实参值传递&引用传递形参&实参方法的定义可能会用到 参数(有参的方法),参数在程序语言中分为:实参(实际参数,Arguments):用于传递给函数/方法的参...

Java开发者必知的15个核心概念,第8个让你恍然大悟!

你是不是经常在面试中被问到Java的基础概念,却总是回答得不够全面?别担心,今天我们就来聊聊Java开发中那些必须掌握的核心知识点,帮你轻松应对各种技术面试! 1. ClassLoader:Java类...

Java8特性之方法引用

方法引用简介如果在Lambda表达式的具体逻辑处理和某个方法的处理逻辑相同,则可以直接将方法名称指代具体的处理逻辑,从而使得整个Lambda表达式更加的简洁,逻辑更加清晰。比如: System.out...