Java基础(5)Java的四种引用

在Java中,根据对象的可达性(可访问性)和垃圾回收机制,引用类型被细分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型在java.lang.ref包中定义,主要用于辅助垃圾回收机制,以更灵活地控制对象的生命周期。

强引用(Strong Reference)

强引用是Java中最常见的引用类型。如果一个对象具有强引用,垃圾回收器绝不会回收它。只要强引用还存在,对象就会保持在内存中。

代码演示:

Object obj = new Object(); // 强引用

解析:

obj这个引用变量超出作用域或被显式设置为null之后,所引用的对象才可能被垃圾回收器回收。

软引用(Soft Reference)

软引用对于内存敏感的高速缓存实现特别有用。如果一个对象只具有软引用,那么在内存足够时它不会被回收,但在内存不足时会被回收。

代码演示:

import java.lang.ref.SoftReference;

Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj);
obj = null; // 清除强引用

解析:

通过上面的代码,obj原本的强引用被清除,这个对象只剩下了一个软引用softRef。这意味着,在JVM即将抛出内存不足异常之前,这个对象可能会被垃圾回收。

弱引用(Weak Reference)

如果一个对象只具有弱引用,不管内存是否足够,只要发生垃圾回收,这个对象就会被回收。

代码演示:

import java.lang.ref.WeakReference;

Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 清除强引用

解析:

通过上述代码,obj的强引用被清除,只留下一个弱引用weakRef。这意味着,下次垃圾回收器运行时,对象将被回收,无论内存是否充足。

虚引用(Phantom Reference)

虚引用完全不会影响对象的生命周期。如果一个对象仅持有虚引用,那么它和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

代码演示:

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, refQueue);
obj = null; // 清除强引用

解析:

虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象之前,把这个虚引用加入到与之关联的引用队列中。虚引用主要用于确保对象被finalize后,做一些特定的资源清理工作。

总结

  • 强引用:只要强引用还在,垃圾回收器永远不会回收掉被引用的对象。
  • 软引用:在内存不足时,垃圾回收器会回收软引用所指向的对象。
  • 弱引用:一旦发生垃圾回收,弱引用指向的对象就会被回收。
  • 虚引用:虚引用不会影响对象的生命周期,任何时候都可能被垃圾回收,用于确保对象被回收时能够接收到一个系统通知。

这四种引用类型提供了更多的灵活性对于垃圾回收和对象生命周期的管理,使得Java程序可以更加高效地利用内存资源,同时也便于开发者进行特定场景下的资源管理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验14 MVC

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握MVC的用法。【参考课本 例1 】 三、源代码以及执行结果截图&#xff1a; example7_1.jsp&#xff1a; <% page contentType"text/html" %> <% page pageEncoding "ut…

宝兰德以全栈智能运维能力为企业数字化转型保驾护航

2020年发布“十四五”规划中提出“加快数字化发展&#xff0c;建设数字中国”&#xff0c;发展数字经济成为国家战略。在数字技术创新应用和国家政策持续利好的大趋势下&#xff0c;面对全行业产业结构调整、资源环境挑战等带来的机遇和难点&#xff0c;我国千行百业的数字化转…

工业互联网通讯协议—欧姆龙(Fins tcp)

一、场景 近期公司要对欧姆龙CP系列设备的数据采集&#xff0c;于是就研究了下欧姆龙的Fins Tcp协议。 二、Fins Tcp 组成字节说明固定头446494E53 FINS对应的ASCII码的十六进制长度4后面剩余指令的长度命令4 握手固定为&#xff1a;00000000 读写固定为&#xff1a;0000000…

CentOS/Anolis的Linux系统如何通过VNC登录远程桌面?

综述 需要在server端启动vncserver&#xff0c;推荐tigervnc的server 然后再本地点来启动client进行访问&#xff0c;访问方式是IPport&#xff08;本质是传递数据包到某个ip的某个port&#xff09; 然后需要防火墙开启端口 服务器上&#xff1a;安装和启动服务 安装服务 y…

Python 可以对数据进行哪些可视化?

Python 可视化 一、条形图&#xff08;或柱状图&#xff09; 1.代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pddf pd.DataFrame({County:[America,Canada,Australia,Germany,French,China],GDP:[80,30,70,80,60,75] })plt.bar(df[County],df[G…

聊聊 ASP.NET Core 中间件(一):一个简单的中间件例子

前言&#xff1a;什么是中间件 服务器在收到 HTTP 请求后会对用户的请求进行一系列的处理&#xff0c;比如检查请求的身份验证信息、处理请求报文头、检查是否存在对应的服务器端响应缓存、找到和请求对应的控制器类中的操作方法等&#xff0c;当控制器类中的操作方法执行完成…

国家开放大学2024年春《Matlab语言及其应用》实验一熟悉Matlab 操作环境参考答案

实验报告 姓名&#xff1a; 学号&#xff1a; 实验一名称&#xff1a;熟悉 Matlab 操作环境 实验目标&#xff1a;通过简单变量和矩阵的录入、计算和查看相关信息&#xff0c;了解 Matlab 操作界面 及各子窗口使用方法。熟悉一系列便于使用的 Matlab 函数和文件的工具。 实…

Oracle索引组织表与大对象平滑迁移至OceanBase的实施方案

作者简介&#xff1a;严军(花名吉远)&#xff0c;十年以上专注于数据库存储领域&#xff0c;精通Oracle、Mysql、OceanBase&#xff0c;对大数据、分布式、高并发、高性能、高可用有丰富的经验。主导过蚂蚁集团核心系统数据库升级&#xff0c;数据库LDC单元化多活项目&#xff…

Qt简单离线音乐播放器

有上传本地音乐文件&#xff0c;播放&#xff0c;暂停&#xff0c;拖拉进度条等功能的播放器。 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMediaPlayer> #include <QFileDialog> #include <QTime&g…

c4d动画代渲染怎么报价?动画代渲染平台(含云渲染农场)

在C4D动画代渲染的报价问题时&#xff0c;需要考虑多个因素&#xff0c;如动画复杂度、渲染时长、所需技术以及市场行情等。动画代渲染平台作为专门提供专业渲染服务的机构&#xff0c;其报价通常会根据客户的具体需求和项目特点来定制。下面一起来看看相关内容吧。 一、c4d动画…

【docker】Spring Boot3.x 打包 Docker容器

Docker化Spring Boot应用 创建文件夹 demo mkdir democd demo创建Dockerfile # 两个 openjdk 二选一 #FROM openjdk:17-jre-alpineFROM eclipse-temurin:17MAINTAINER chengxuyuanshitang <chengxuyuanshitangXX.com>RUN mkdir -p /workspace/java/demoCOPY demo.ja…

nginx+Tomcat动静分离

本⽂的动静分离主要是通过nginxtomcat来实现&#xff0c;其中nginx处理图⽚、html等静态的⽂ 件&#xff0c;tomcat处理jsp、do等动态⽂件. 实验环境 192.168.200.133 nginx反向代理 192.168.200.129 static 192.168.200.130 dynamic 步骤 修改三台主机名 [rootadmin ~]#…

专注 APT 攻击与防御—sql server 常用操作远程桌面语句

SqlServer 常用操作远程桌面语句 1、是否开启远程桌面 1&#xff1a;表示关闭0&#xff1a;表示开启 EXEC master..xp_regread HKEY_LOCAL_MACHINE,SYSTEM\CurrentControlSet\Control\Terminal Server,fDenyTSConnections 2、读取远程桌面端口 EXEC master..xp_regread HKE…

LabVIEW飞机机电系统综合测试平台

LabVIEW飞机机电系统综合测试平台 在现代航空领域&#xff0c;机电系统的准确性与可靠性对飞行安全至关重要。针对飞机机电管理计算机&#xff08;UMC&#xff09;复杂度增加、测试覆盖率低、效率不高等问题&#xff0c;开发了一套基于LabVIEW的机电系统综合测试平台。平台通过…

1天搞定uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时&#xff0c;不可避免的要用到可视化的数据管理后台&#xff0c;而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1&#xff0c;下载HBuilderX 开发者…

qt嵌入并控制外部程序

一、流程 1、调用Window接口模拟鼠标&#xff0c;键盘事件 POINT point; LPPOINT lpppoint &point; GetCursorPos(lpppoint);//获取鼠标位置 SetCursorPos(point.x, point.y);//设置鼠标位置//鼠标左键按下 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, poi…

Stm32CubeMX 为 stm32mp135d 添加 spi

Stm32CubeMX 为 stm32mp135d 添加 spi 一、启用设备1. spi 设备添加2. spi 引脚配置2. spi 时钟配置 二、 生成代码1. optee 配置 spi 时钟和安全验证2. linux spi 设备 dts 配置 bringup 可参考&#xff1a;Stm32CubeMX 生成设备树 一、启用设备 1. spi 设备添加 选中spi设…

Django后台项目开发实战四

用户可以浏览工作列表以及工作详情 第四阶段 在 jobs 文件夹下创建 templates 文件夹&#xff0c;在里面创建 base.html 网页&#xff0c;内容如下 <!-- base.html --> <div style"text-align:center;"><h1 style "margin:auto; width:50%;&…

【Canvas与艺术】绘制地平线

【关键点】 灭点在透视中的作用。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用HTML5/Canvas绘制地平线<…

神经网络的优化器

神经网络的优化器是用于训练神经网络的一类算法&#xff0c;它们的核心目的是通过改变神经网络的权值参数来最小化或最大化一个损失函数。优化器对损失函数的搜索过程对于神经网络性能至关重要。 作用&#xff1a; 参数更新&#xff1a;优化器通过计算损失函数相对于权重参数的…
最新文章