JVM 引用类型

Posted jalja

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM 引用类型相关的知识,希望对你有一定的参考价值。

技术图片

 

1、强引用

强引用,是在我们的开发工作当中普遍存在的。如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它。当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收具有强引用的对象来释放内存。我们可以将对象显示的赋值为null,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。也就是说方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容(Object)保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个Object会被回收。

 技术图片

2、软引用

 SoftReference:是比强引用弱化的引用,可以让对象豁免一些垃圾回收,软引用通常在对内存比较敏感的程序中,例如高速缓存区,mybatis就是用到了该方式。他的特点就是 存充足的时候不被回收,内存不足时才被回收。 

 技术图片

技术图片
package com.jalja.java.reference;

import java.lang.ref.SoftReference;

/**
 * @Auther: XL
 * @Date: 2019/12/24 07:50
 * @Description:
 */
public class SoftReferenceTest {
    public static void main(String [] args) throws Exception{
        //softReferenceAmple();
        softReferenceNotAmple();
    }

    /**
     * 内存充足
     */
    private static void  softReferenceAmple(){
        Object o=new Object();
        SoftReference<Object> reference=new SoftReference<>(o);
        System.out.println(o);
        System.out.println(reference.get());

        o=null;
        System.gc();
        System.out.println(o);
        System.out.println(reference.get());
    }

    /**
     * 内存不足就回收
     */
    private static void  softReferenceNotAmple(){
        Object o=new Object();
        SoftReference<Object> reference=new SoftReference<>(o);
        System.out.println(o);
        System.out.println(reference.get());
        o=null;
        try {
            byte[]bytes=new byte[30*1024*1024];
        }finally {
            System.out.println(o);
            System.out.println(reference.get());
        }
    }
}
View Code

3、弱引用

 WeakReference:无论内存是否足够,只要发生GC 弱引用的对象一定被回收

技术图片
package com.jalja.java.reference;

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;

/**
 * @Auther: XL
 * @Date: 2019/12/24 08:02
 * @Description:
 */
public class WeakReferenceTest {
    public static void main(String [] args) throws Exception{
        weakReferenceTest();
    }

    /**
     * 内存充足
     */
    private static void weakReferenceTest(){
        Object o=new Object();
        WeakReference<Object> reference=new WeakReference<>(o);
        System.out.println(o);
        System.out.println(reference.get());

        o=null;
        System.gc();
        System.out.println("==========GC=========");
        System.out.println(o);
        System.out.println(reference.get());
    }
    private static void weakHashMapTest(){
        WeakHashMap<String,Object> weakHashMap=new WeakHashMap<>();

    }
}
View Code

 

 WeakHashMap:

 

4、虚引用

 PhantomReference:

技术图片

 

    public static void main(String [] args) throws Exception{
        Object o=new Object();
        ReferenceQueue<Object> queue=new ReferenceQueue();
        PhantomReference<Object> reference=new PhantomReference<>(o,queue);
        System.out.println(o);
        System.out.println(reference.get());
        System.out.println(queue.poll());

        o=null;
        System.gc();
        System.out.println("==========GC=========");
        System.out.println(o);
        System.out.println(reference.get());
        System.out.println(queue.poll());
    }

引用队列:ReferenceQueue

 技术图片

package com.jalja.java.reference;

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

/**
 * @Auther: XL
 * @Date: 2019/12/24 08:28
 * @Description: ReferenceQueue 引用队列,在GC后悔保留对象的引用
 */
public class ReferenceQueueTest {
    public static void main(String [] args) throws Exception{
        Object o=new Object();
        ReferenceQueue<Object> queue=new ReferenceQueue();
        WeakReference<Object> reference=new WeakReference<>(o,queue);
        System.out.println(o);
        System.out.println(reference.get());
        System.out.println(queue.poll());

        o=null;
        System.gc();
        System.out.println("==========GC=========");
        System.out.println(o);
        System.out.println(reference.get());
        System.out.println(queue.poll());
    }
}

 

以上是关于JVM 引用类型的主要内容,如果未能解决你的问题,请参考以下文章

一篇笔记整理JVM工作原理

一篇笔记整理JVM工作原理

JVM的数据类型

jvm引用类型

变量的内存分析图

JVM堆与JVM栈