首页 > 编程语言 >【Java】四种引用和引用队列的概念

【Java】四种引用和引用队列的概念

时间:2023-01-08 18:23:33浏览次数:44  
标签:缓存 Java 队列 回收 关联 对象 引用 JVM

四种引用类型

  1. 强引用(StrongReference)
    强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:
Object object = new Object();
String str = "hello";

只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

  1. 软引用(SoftReference)
    软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

注意:只有在内存不足的时候JVM才会回收软引用关联着的对象。

  1. 弱引用(WeakReference)
    弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
public static void main(String[] args) {
        
        WeakReference<String> str = new WeakReference<String>(new String("hello"));
        System.out.println(str.get());
        System.gc();
        System.out.println(str.get());
}

运行上面的代码输出

hello
null

4.虚引用(PhantomReference)
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知。虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现该对象具有虚引用,那么在回收之前会首先把该对象的虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用,来了解被引用的对象是否被GC回收。

四种引用类型使用场景

  • 强引用类型是在代码中普遍存在,无须解释
  • 软引用和弱引用:两者都可以实现缓存功能,但软引用实现的缓存通常用在服务端,而在移动设备中的内存更为紧缺,对垃圾回收更为敏感,因此android中的缓存通常是用弱引用来实现(比如LruCache)
  • 虚引用 为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知

引用队列 ReferenceQueue

使用SoftReference,WeakReference,PhantomReference 的时候,可以关联一个ReferenceQueue。那么当垃圾回收器准备回收一个被引用包装的对象时,该引用会被加入到关联的ReferenceQueue。程序可以通过判断引用队列中是否已经加入引用,来了解被引用的对象是否被GC回收。



标签:缓存,Java,队列,回收,关联,对象,引用,JVM
From: https://www.cnblogs.com/cuipengchong/p/17035035.html

相关文章

  • javascript 操作剪切板
    此库优点:支持电脑和手机端浏览器第一步:声明一个对象$(function(){varclipboard=newClipboardJS(document.getElementById("btnCopyFileShareLink"......
  • JAVA工程师学习教程之Set和HashMap集锦
    day14_JAVAOOP课程目标1.【理解】Set集合的特点2.【理解】Set集合不重复的原理3.【掌握】HaseSet集合的基本使用4.【理解】LinkedHashSet的特点5.【理解】Map集......
  • JAVAEE工程师零基础学习教程之泛型类和File类
    day15_JAVAOOP课程目标1.【理解】什么是泛型2.【掌握】泛型的基本使用3.【理解】什么是Collections工具类4.【理解】什么是File类5.【掌握】File类的常用功能6.......
  • java并发编程_线程
    创建进程方式1,start一个新的线程,启动线程后回调newRunnable中的run方法,run方法调用结束后,JVM等待回收线程。publicclassFutureTaskOne{publicstaticvoidmai......
  • Java中Elasticsearch 实现分页方式(三种方式)
    目录ES简介ES的特点:一、from+size浅分页二、scroll深分页scroll删除三、search_after深分页ES简介Elasticsearch是一个基于Lucene实现的......
  • docker实战: vue+java+uniapp部署到阿里云服务器详解(此文没有使用宝塔面板部署),附带各种
    一、部署前准备工具以及注意事项:项目来源:https://gitee.com/ZhongBangKeJi/crmeb_java?_from=gitee_search官方部署文档:https://doc.crmeb.com/java/crmeb_java1.ide:ide......
  • 08.(结构型模式)java设计模式之组合模式
    一、什么是组合模式简介:组合模式(CompositePattern),又叫部分整体模式,它创建了对象组的树形结构。将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树......
  • Java 集合 - Collections 和 Arrays
    Collections介绍Collections是一个操作Set、List和Map等集合的工具类。常用方法1、binarySearch()二分法查找List;2、reverse()循序颠倒list;3、shuffle()......
  • JavaFX:FX.应用更新检测功能(在线自动更新方案)
    JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。1.整体方案JavaFX.应用版本检测、自动更新主要涉及一下步......
  • java中 instance
    instanceof用法:aaainstanceofCCC功能:判断前面的对象aaa是否属于后面的类CCC,或者属于其子类;如果是,返回true,不是返回false; 用在多态发生时,子类只能调用父类中的方......