美文网首页
JVM-引用

JVM-引用

作者: GIT提交不上 | 来源:发表于2020-03-11 20:24 被阅读0次

  Java引用类结构如下所示:

图1-1 Java引用.png 图1-2 JVM引用.png

  强引用:就算出现OOM也不对该对象进行回收,不进行GC。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        Object obj2 = obj1;
        obj1 = null;
        System.gc();
        System.out.println(obj2);
    }
}

  软引用:系统内存充足时不会被回收,反正则会被回收。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        SoftReference<Object> softReference = new SoftReference<>(obj1);

        System.out.println(obj1);
        System.out.println(softReference.get());

        obj1 = null;
        //-Xms5m -Xmx5m
        try {
            Byte[] bytes = new Byte[10*1024*1024];
        }finally {
            System.out.println(obj1);
            System.out.println(softReference.get());
        }
    }
}

  弱引用:只要垃圾回收机制一运行,不管JVM内存空间是否足够,都会回收该对象占用的内存。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        WeakReference<Object> weakReference = new WeakReference<>(obj1);

        System.out.println(obj1);
        System.out.println(weakReference.get());

        obj1 = null;
        System.gc();

        System.out.println(obj1);
        System.out.println(weakReference.get());
    }
}

  软引用,弱引用:适用缓存。

图1-3 软引用 & 弱引用试用场景.png

  WeakHashMap示例代码如下:

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        WeakHashMap<Integer,String> weakHashMap = new WeakHashMap<>();
        //Integer key = 2;
        Integer key = new Integer(2);
        String value = "luffy";
        weakHashMap.put(key,value);
        System.out.println(weakHashMap);
        key = null;
        System.out.println(weakHashMap);
        System.gc();
        System.out.println(weakHashMap);
    }
}

  虚引用:如果一个对象仅持有虚引用,无任何引用,虚引用的get方法总是返回null,任何时候都可能被GC,GC时被放入引用队列。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        //通知机制
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj1,referenceQueue);

        System.out.println(obj1);

        System.out.println(phantomReference.get()); //总返回null
        System.out.println(referenceQueue.poll());

        obj1 = null;
        System.gc();
        System.out.println("======================================");
        System.out.println(obj1);
        System.out.println(phantomReference.get()); //总返回null
        System.out.println(referenceQueue.poll());
    }
}

相关文章

  • JVM-引用

      Java引用类结构如下所示:   强引用:就算出现OOM也不对该对象进行回收,不进行GC。   软引用:系统内...

  • JVM类加载器与双亲委派模型(JDK8)

    引言 在上文JVM-类加载机制[https://imchenway.com/2021/07/01/JVM-%E7%...

  • JVM-常见参数

    [TOC] JVM-常见参数 实验平台MacOSmacOS Catalina 10.15内存 8 GB 2133 ...

  • Java编程技术之浅析JVM内存

    JVM JVM->Java Virtual Machine:Java虚拟机,是一种用于计算设备的规范,它是一个虚构...

  • JVM-理论

    1 概述 java 8使用比例最高,非java 8直接装java 11即可字节码可以由多种语言提供,jvm不止可以...

  • JVM-对象

    这里研究的是普通 java 对象,不包括数组和 Class 对象等。 1. 对象的创建 1.1. new 我们创建...

  • JVM-从字节码到运行时(2)

    JVM-从字节码到运行时(2) 基于栈的解释器执行过程 这是例子ByteCodeDemo类中的add(int z)...

  • JVM-对象内存布局

    jvm-对象内存布局 对象内存结构概述 对象的创建过程: jvm将对象所在的class文件加载到方法区中 jvm读...

  • JVM-从字节码到运行时(1)

    JVM-从字节码到运行时(1) 一切从javap -verbose开始 希望借此文章将Class文件结构和运行时的...

  • JVM-线程状态

    JVM的线程状态的功能是用于监控,不能用作实质性控制。linux中的这四个状态在java的线程状态中没有对应"D ...

网友评论

      本文标题:JVM-引用

      本文链接:https://www.haomeiwen.com/subject/udygdhtx.html