你知道 Java 有哪些引用吗?

news/2024/11/19 0:42:56/文章来源:https://www.cnblogs.com/fuxing/p/18197372

前言

判断对象是否要回收有引用计数法和可达性算法两种方式,无论哪种都离不开引用,本文将介绍Java的四种引用。


一、概述

image.png

image.png

二、详解

1. 强引用

概述

在Java程序中,强引用是最常见的也是默认的。new了一个对象,并将其指向一个变量,这个变量就成为指向该对象的一个强引用。

特点

  1. 强引用可以直接访问目标对象;
  2. 强引用所指向的对象在任何时候都不会被系统回收;
  3. 强引用可能导致内存泄漏。

实现方式

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. 软引用

概述

软引用是用来描述一些还有用,但非必需的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。

特点

  1. 软引用所指向的对象,内存溢出前才被系统回收;
  2. 软引用被回收后还没有足够的内存,仍会抛出内存溢出异常;
  3. GC 决定收回软可达对象时,会清理软引用,并可选地把引用存放到一个引用队列(Reference Queue)。

场景

软引用通常用来实现内存敏感的缓存。比如:可以使用软引用来缓存最近使用的图片或文本,一旦内存不足,垃圾回收器就会回收这些对象,从而释放内存。

实现方式

Object obj = new Object(); // 声明强引用
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null; //销毁强引用

3. 弱引用

概述

弱引用也是用来描述那些非必需对象,但是在系统GC时,只要发现弱引用,不管系统堆空间使用是否充足,都会回收掉只被弱引用关联的对象。 (但是,由于垃圾回收器的线程通常优先级很低,因此,并不一定能很快地发现持有弱引用的对象。在这种情况下,弱引用对象可以存在较长的时间。)

特点

弱引用所指向的对象,被发现就会被系统回收;

场景

  1. 缓存中存放的一些临时的数据。如,ThreadLocal;
  2. 多线程中经常被用来监控对象是否被垃圾回收器标记。

实现方式

Object obj = new Object(); // 声明强引用
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null; //销毁强引用

4. 虚引用

概述

所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会决定对象的生命周期。

特点

  1. 不能单独使用,虚引用必须和引用队列一起使用;
  2. 一个对象只被虚引用变量引用时,垃圾回收器会将该对象加入引用队列中;
  3. 无法通过虚引用来获取被引用的对象(当试图通过虚引用的get()方法取得对象时,总是null)。

场景

在回收该对象之前,虚引用变量将被放入引用队列中,因此通常用于在对象被回收时执行必要的清理工作。例如:

  1. 关闭数据库连接或释放资源在并发编程中;
  2. 实现一些高级的对象生命周期管理,例如,对象池和线程池等。(追踪对象的生命周期,并在对象不再使用时及时清理它们,从而保证系统的可靠性和性能)

实现方式

Object obj = new Object(); // 声明强引用
ReferenceQueue phantomQueue = new ReferenceQueue(); //须和引用队列一起使用
PhantomReference<Object> pf = new PhantomReference<>(obj, phantomQueue);
obj = null;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707644.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过HPA+CronHPA组合应对业务复杂弹性伸缩场景

华为云CCE服务通过将HPA与CronHPA组合,实现指标弹性策略与定时弹性策略的有机协同,满足了客户业务复杂的弹性伸缩场景。本文分享自华为云社区《通过HPA+CronHPA组合应对业务复杂弹性伸缩场景》,作者:云容器大未来。背景 在k8s集群中,容器水平自动伸缩(HPA),可以根据容器资…

Linux基础知识(Ubuntu)

文件权限 意义权限类型 1. r 可读 2. w 可写 3. x 可执行/切换陌路 4. - 无权限通配符 * 匹配0个或多个字符串 ?匹配1个字符 [abcd] 匹配abcd中间任意一个字符 [a-Z] 匹配a-Z范围里的任意一个字符 [!abc] 不匹配方括号里的任何一个字符 ;与[^abc]一致帮助命令 man 语法 man […

join、inner join、left join、right join、outer join的区别

什么是联结?union、intersect等集合运算,它的特征是以 “行” 为单位进行操作,通俗点说,就是进行这些集合运算,会导致记录行数的增减,使用union会增加记录行数,使用 intersect 或 expect 会减少行记录,集合运算不会导致 “列” 数量的改变。而联结(join) 操作,就是将其…

基于.net core 七牛云上传多图片

一、基于.net core 七牛云上传图片上传创建七牛云账号,链接:https://portal.qiniu.com/home 新建空间(可以选择华北,可设置公开或私有(公开返回前台不需要token))单图片上传 /// <summary> /// 上传文件 /// </summary> /// <param name="file"…

Hadoop集群配置免密SSH登录方法

K8s集群配置免密ssh登录 K8S集群包含1个主节点和2个从节点,需要实现各节点之间的免密码登录,下面介绍具体的实现方法。 一、K8s集群环境 二、免密登录原理 每台主机authorized_keys文件里面包含的主机(ssh密钥),该主机都能无密码登录,每台主机的authorized_keys文件里面…

element-ui里选择器select多选

select默认情况下都是单选(如上图),但有时候就需要多选,那就需要添加multiple属性,但这样的话数据会一直叠加,把选择框撑大,如下图:这样的话需要添加 collapse-tags 属性将它们合并为一段文字,效果如下:但如果选多了,清除会不方便,那样的话需要添加clearable属性,…

Oracle11g-EXP-00091错误

环境说明 oracle 11g win10 问题情况 在终端中exp导出数据库时,遇到报错“EXP-00091”,按照网上教程修改NLS_LANG但是没有效果。最终原因 在power中设置环境变量NLS_LANG的方法与CMD不一样。 备注记录 先通过服务端查询编码集 select * from nls_database_parameters t where…

Python03判断语句

Python03判断语句 比较运算符if语句

统一文件传输平台如何建设 才能实现文件传输受管、可控、高效?

统一文件传输平台是为了满足企业或组织在不同网络区域间安全、高效地传输文件的需求而设计的系统。这样的平台通常具备以下特点: 1、跨区域传输能力:支持在不同地理位置的分支机构或数据中心之间传输文件。 2、安全性:提供加密传输、用户认证、权限控制等安全特性,确保数据…

基于Vue3水印组件封装:防篡改守护!

基于Vue 3的全新水印通用组件封装。这款组件不仅功能强大,而且易于集成,能够轻松为您在网页任何位置添加自定义水印,有效防止内容被篡改或盗用。基于Vue 3的全新水印通用组件。这款组件不仅功能强大,而且易于集成,能够轻松为您的网页或应用添加自定义水印,有效防止内容被…

在线Base64转文件、文件转Base64工具

在线Base64转换神器,一键实现Base64编码与文件互转!支持图片、文档等各类文件,快速准确,安全无服务器存储。拖拽上传,轻松编码解码,提升开发效率。跨平台兼容,移动端友好,让数据转换再无障碍。在线Base64转文件、文件转Base64工具

怎样统一、高效地实现百台以上的机台设备文件导出?

许多高端制造企业的运转都以机台为基础,如光学仪器制造及研究,晶圆制造,医学设备等,而大型的高端制造业不仅配备机台设备,同时数量也会非常客观,会达到上百台,当企业扩充规模,设立分公司和厂区时,机台设备甚至可达上千台,此时,对于企业而言,机台设备文件导出就会变…