JVM系列之引用

作者: 简楼 | 来源:发表于2021-04-05 21:44 被阅读0次

前言

在了解java虚拟机的GC垃圾回收机制之前,我们先来了解下,java中的引用。

了解下java中的引用

JAVA中提供了四种引用类型:强引用、软引用、软引用和虚引用;
在四种引用类型中,只有强引用FinalReference类型变量是包内可见的,其他三种引用类型均为public,可以在程序中直接使用;


image.png
强引用
  1. 强引用可以直接访问目标对象
  2. 只要有引用变量存在,垃圾回收器永远不会回收。JVM即使抛出OOM异常,也不会回收强引用所指向的对象
  3. 强引用可能导致内存泄漏

强引用是使用最普遍的引用。如果一个对象具有强引用,那么垃圾回收器绝不会回收它。

软引用

软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

可以通过java.lang.ref.SoftReference使用软引用。

 // 软引用
 String str = new String("abc");
 SoftReference<String> softReference = new SoftReference<String>(str);

软引用可以和一个引用队列(ReferenceQueue)联合使用。如果软引用所引用对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中;

也就是说,垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象,而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象。对那些刚构建的或刚使用过的较新的软对象会被虚拟机尽可能保留,这就是引入引用队列ReferenceQueue的原因;

如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。利用这个方法,可以检查哪个SoftReference所软引用的对象已经被回收,于是可以把这些失去所软引用的对象的SoftReference对象清除掉;

弱引用

弱引用是一种比软引用较弱的引用类型,也就是弱引用的对象拥有更短暂的生命周期。在系统GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收;

弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记;

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中

垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

虚引用

虚引用是所有类型中最弱的一个,一个持有虚引用的对象和没有引用几乎是一样的,随时可能被垃圾回收器回收;

虚引用必须和引用队列一起使用,它的作用在于检测对象是否已经从内存中删除,跟踪垃圾回收过程;
如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

总结

Java中4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用

相关文章

  • JVM系列之引用

    前言 在了解java虚拟机的GC垃圾回收机制之前,我们先来了解下,java中的引用。 了解下java中的引用 JA...

  • Dubbo系列之常用配置用法简介

    Dubbo系列之常用配置用法简介 1、配置原则 配置原则,引用官方的图片: JVM 启动 -D 参数优先,这样可以...

  • 重温系列之JVM:Java引用类型

    强引用 在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强...

  • JVM源码分析之FinalReference完全解读

    注:文章首发于InfoQ:JVM源码分析之FinalReference 概述 JAVA对象引用体系除了强引用之外,...

  • JVM介绍系列文章

    知晓JVM系列(一):对JVM总览知晓JVM系列(二):JVM内存管理机制与优化初探知晓JVM系列(三) :常用的...

  • JVM基础知识系列

    JVM基础系列 JVM知识点扫盲系列(1) JVM知识点扫盲系列(2) JVM内存的那些事 JVM类加载的那些事 ...

  • JVM

    简介 Jvm 系列一:Java类的加载机制Jvm系列二:JVM内存结构 --内存泄漏与内存溢出Jvm系列三:GC算...

  • JVM系列之 _call_stub_entry初始化

    在上文JVM系列之函数调用入门已经简单介绍了JVM是如何调用方法的:JVM先调用call_stub()方法将_ca...

  • JVM引用

    Java 执行GC判断对象是否存活有两种方式其中一种是引用计数 引用计数概念:JAVA Heap(堆)中每个对象有...

  • Java 四种引用方式的区别

    强引用(StrongReference) 只要某个对象有强引用与之相关联,JVM一定不会回收这个对象,当内存不足时...

网友评论

    本文标题:JVM系列之引用

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