你知道 Java 有哪些引用吗?
前言
判断对象是否要回收有引用计数法和可达性算法两种方式,无论哪种都离不开引用,本文将介绍Java的四种引用。
一、概述


二、详解
1. 强引用
概述
在Java程序中,强引用是最常见的也是默认的。new了一个对象,并将其指向一个变量,这个变量就成为指向该对象的一个强引用。
特点
- 强引用可以直接访问目标对象;
- 强引用所指向的对象在任何时候都不会被系统回收;
- 强引用可能导致内存泄漏。
实现方式
Object obj = new Object() //这里的obj就是一个强引用
Object obj = new Object(); // 声明强引用
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null; //销毁强引用
Object obj = new Object(); // 声明强引用
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null; //销毁强引用
Object obj = new Object(); // 声明强引用
ReferenceQueue phantomQueue = new ReferenceQueue();
PhantomReference<Object> pf = new PhantomReference<>(obj, phantomQueue);
obj = null;
2. 软引用
概述
软引用是用来描述一些还有用,但非必需的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
特点
- 软引用所指向的对象,内存溢出前才被系统回收;
- 软引用被回收后还没有足够的内存,仍会抛出内存溢出异常;
- GC 决定收回软可达对象时,会清理软引用,并可选地把引用存放到一个引用队列(Reference Queue)。
场景
软引用通常用来实现内存敏感的缓存。比如:可以使用软引用来缓存最近使用的图片或文本,一旦内存不足,垃圾回收器就会回收这些对象,从而释放内存。
实现方式
Object obj = new Object(); // 声明强引用
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null; //销毁强引用
3. 弱引用
概述
弱引用也是用来描述那些非必需对象,但是在系统GC时,只要发现弱引用,不管系统堆空间使用是否充足,都会回收掉只被弱引用关联的对象。 (但是,由于垃圾回收器的线程通常优先级很低,因此,并不一定能很快地发现持有弱引用的对象。在这种情况下,弱引用对象可以存在较长的时间。)
特点
弱引用所指向的对象,被发现就会被系统回收;
场景
- 缓存中存放的一些临时的数据。如,ThreadLocal;
- 多线程中经常被用来监控对象是否被垃圾回收器标记。
实现方式
Object obj = new Object(); // 声明强引用
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null; //销毁强引用
4. 虚引用
概述
所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会决定对象的生命周期。
特点
- 不能单独使用,虚引用必须和引用队列一起使用;
- 一个对象只被虚引用变量引用时,垃圾回收器会将该对象加入引用队列中;
- 无法通过虚引用来获取被引用的对象(当试图通过虚引用的get()方法取得对象时,总是null)。
场景
在回收该对象之前,虚引用变量将被放入引用队列中,因此通常用于在对象被回收时执行必要的清理工作。例如:
- 关闭数据库连接或释放资源在并发编程中;
- 实现一些高级的对象生命周期管理,例如,对象池和线程池等。(追踪对象的生命周期,并在对象不再使用时及时清理它们,从而保证系统的可靠性和性能)
实现方式
Object obj = new Object(); // 声明强引用
ReferenceQueue phantomQueue = new ReferenceQueue(); //须和引用队列一起使用
PhantomReference<Object> pf = new PhantomReference<>(obj, phantomQueue);
obj = null;
你知道 Java 有哪些引用吗?的更多相关文章
- Java学习之强引用,弱引用,软引用 与 JVM
1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括 强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...
- Java web项目引用java项目,类型找不到
Java web项目引用java项目,类型找不到 错误信息: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapp ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
- 闲来无事,用Java的软引用写了一个山寨的缓存
闲来无事,用Java的软引用写了一个山寨的缓存 博客分类: java基础 众所周知java中的引用分为 StrongReference.SoftReference.WeakReference.Phan ...
- Java 集合 持有引用 & WeakHashMap
Java 集合 持有引用 & WeakHashMap @author ixenos 摘要:强引用.弱引用.WeakHashMap动态回收步骤 Reference引用对象 可获得的(reacha ...
- java到底是引用传递还是值传递?
今天我们来讲讲一个在学习中容易误解的问题,面试中也偶尔问到,java方法调用时到底是值传递还是引用传递? 首先,请大家来做一个判断题,下面的3个问题是否描述正确 1. java基本数据类型传递是值传递 ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- Java中的引用传递和值传递
Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...
- Java中没有引用传递只有值传递(在函数中)
◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下 ...
- 不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用
小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...
随机推荐
- #矩阵乘法,斐波那契#洛谷 2544 [AHOI2004] 数字迷阵
题目 分析 oeis找规律得到第一列和第二列的通项公式,然后矩阵乘法 代码 #include <cstdio> #include <cctype> #include <c ...
- Socket.D v2.4.9 发布
Socket.D 是什么东东? 是基于"事件"和"语义消息""流"的网络应用协议.在微服务.移动应用.物联网等场景,可替代 http.web ...
- 使用OHOS SDK构建zziplib
参照OHOS IDE和SDK的安装方法配置好开发环境. 从gitee下载源码,当前最新的提交记录ID为6699e0fe8a0307b16dcc055eda04452e13abe63a. 执行如下命令: ...
- Linux系统奇安信浏览器报错跨域:the resource is in more-private address space 'local'
报错: Access to XMLHttpRequest at "123" from origin "456" has been blocked by CORS ...
- Python生成唯一ID----UUID
# UUID 生成唯一ID # uuid 是Python内置模块,主要有五种算法. import uuid # uuid1() 基于时间戳 a1 = uuid.uuid1() print('uuid1 ...
- 【鸿蒙生态千帆起】HarmonyOS系统级地图与位置服务,赋能广大开发者
在"与HarmonyOS同行,开放生态,共赢未来"为主题的HUAWEI Developer Day(简称HDD)沙龙中,Petal Maps为开发者们带来了在HarmonyOS下 ...
- 重新点亮linux 命令树————修改网络配置[十一四]
前言 整理一下网络配置的修改. 正文 网络配置命令 ifconfig <接口> <ip地址> [netmask 子网掩码] ifup <接口> ifdown < ...
- 记一次 Go 调用系统命令出现的问题分析
首先在程序中封装了下面一个函数用来执行系统命令: // 执行系统命令 func executeCommand(command string, output, outerr io.Writer) err ...
- JavaScript中字符串小知识
1. 字符串是不可变的 字符串一旦创建就是不可变的,后续的修改都是新建一个新的字符串而不是在原有的字符串上修改 // 在内存中开辟 可以存放五个字母的空间 str指向该空间 let str = 'fi ...
- 【Oracle】对一个已经拥有重复数据的表的列设置唯一性约束
对一个已经拥有重复数据的表的列设置唯一性约束 在这种情况下创建唯一性约束,可以发现会报错,通常为由于存在重复的键值,无法生效唯一性约束 最简单的方法,就是删除重复的记录,这样就可以按照正常流程,创建唯 ...