JVM如何判断一个对象可以被回收

在 Java 中,JVM 使用 垃圾回收器 (GC) 来自动管理内存。JVM 判断一个对象是否可以被回收的主要依据是 对象是否可达。具体来说,如果某个对象不再被任何可达的引用所引用,那么这个对象就可以被认为是 垃圾,可以被回收。

判断一个对象是否可以被回收的标准:

  1. 可达性分析 (Reachability Analysis)
    • JVM 使用 可达性分析 算法来判断一个对象是否可以被回收。如果从 GC Root(垃圾回收根对象)开始,无法通过任何引用链访问到该对象,则该对象是不可达的,可以被回收。
    • GC Root通常包括以下几种对象:
      • 当前线程的栈帧(局部变量)
      • 方法区中的类和常量池
      • 活跃的线程等
  2. 引用类型
    • 强引用:最常见的引用类型。只要对象有强引用,它就不会被回收。
    • 软引用:对象在内存不足时可以被回收。
    • 弱引用:当垃圾回收器进行回收时,弱引用指向的对象会被回收。
    • 虚引用:无法通过虚引用访问到对象,只能用来在对象被回收时收到通知。

举例代码

1. 强引用
public class StrongReferenceExample {public static void main(String[] args) {Object obj = new Object(); // obj 是对 Object 的强引用obj = null;  // 强引用解除,obj 变为 null,但对象还未被回收}
}

在这个例子中,obj 最初指向一个 Object 实例。如果没有其他引用指向这个对象,那么在 obj = null 后,这个对象成为不可达对象,最终会被垃圾回收器回收。

2. 软引用
import java.lang.ref.SoftReference;public class SoftReferenceExample {public static void main(String[] args) {Object obj = new Object();SoftReference<Object> softRef = new SoftReference<>(obj);obj = null; // 解除强引用// 在内存不足时,软引用指向的对象会被回收System.gc(); // 请求进行垃圾回收Object recoveredObj = softRef.get(); // 获取软引用的对象if (recoveredObj != null) {System.out.println("软引用指向的对象仍然存在");} else {System.out.println("软引用指向的对象已经被回收");}}
}

在这个例子中,SoftReference 提供了一种引用类型,当内存紧张时,JVM 会回收软引用指向的对象。

3. 弱引用
import java.lang.ref.WeakReference;public class WeakReferenceExample {public static void main(String[] args) {Object obj = new Object();WeakReference<Object> weakRef = new WeakReference<>(obj);obj = null; // 解除强引用// 弱引用对象在下次垃圾回收时会被回收System.gc(); // 请求进行垃圾回收Object recoveredObj = weakRef.get(); // 获取弱引用的对象if (recoveredObj != null) {System.out.println("弱引用指向的对象仍然存在");} else {System.out.println("弱引用指向的对象已经被回收");}}
}

在这个例子中,WeakReference 指向的对象会在下一次垃圾回收时被回收,即使它还有弱引用指向它。

4. 虚引用

虚引用不用于访问对象,它只能和 ReferenceQueue 一起使用,通常用于在对象被回收时执行一些清理工作。

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;public class PhantomReferenceExample {public static void main(String[] args) {Object obj = new Object();ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue);obj = null; // 解除强引用System.gc(); // 请求进行垃圾回收// 检查虚引用是否已经入队if (phantomRef.isEnqueued()) {System.out.println("虚引用指向的对象已经被回收");} else {System.out.println("虚引用指向的对象没有被回收");}}
}

在这个例子中,PhantomReference 是一种特殊的引用类型,允许在对象被回收后通知应用程序执行一些清理工作。

引用计数法和可达性分析法

JVM 常用的垃圾回收算法是 可达性分析法,它检查对象的引用链。另一种经典的算法是 引用计数法,但这种方法容易出现 循环引用 的问题。

可达性分析法:这是当前大部分 JVM 的实现方式。它从 GC Root 出发,追踪对象图,通过图中的引用关系判断对象是否可达。
  • 如果对象 A 是 GC Root 可达的,且对象 A 引用了对象 B,B 也可达。
  • 如果对象 C 不可达(没有被 GC Root 引用),则对象 C 被认为是垃圾。
引用计数法:这种方法给每个对象添加一个引用计数器,当计数器为 0 时,对象可被回收。但这种方法无法处理循环引用的问题,因此在实际中较少使用。

总结

  • JVM 判断对象是否可以回收,主要基于 可达性分析法,如果一个对象不可达(即没有任何引用链可以访问到该对象),它就可以被回收。
  • 引用类型(强引用、软引用、弱引用、虚引用)会影响对象的回收行为。

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

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

相关文章

基于云服务器的数仓搭建-hive/spark安装

mysql本地安装 安装流程&#xff08;内存占用200M&#xff0c;升至2.1G&#xff09; # 将资料里mysql文件夹及里面所有内容上传到/opt/software/mysql目录下 mkdir /opt/software/mysql cd /opt/software/mysql/ # 待上传文件 install_mysql.sh mysql-community-client-8.0.3…

华为配置篇-ISIS基础实验

ISIS 一、简述二、常用命令总结三、实验 一、简述 一、基本定义与历史背景 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是一种链路状态路由协议&#xff0c;最初由ISO设计用于OSI&#xff08;开放系统互联&#…

Python 练习项目:MBTI 命令行测试工具

在当今数字化的时代,心理测试工具越来越受到欢迎,它们帮助人们更好地了解自己,做出更明智的职业选择,甚至改善人际关系。MBTI(迈尔斯-布里格斯性格分类法)是其中一种广为人知的人格测试,通过评估个人在四个维度上的偏好(外向-内向、实感-直觉、理智-情感、判断-理解),…

github使用

登录github&#xff0c;创建仓库&#xff08;repository&#xff09; 如创建一个ADXL345名字的私有仓库 git下载安装 打开git&#xff1a;鼠标右键&#xff0c;选择“Open Git Bash here”&#xff0c;进入 ⭐Git 和 GitHub 绑定 Git 获取SSH keys $ cd ~/.ssh #查看 …

如何在Windows上下载并配置GO语言环境变量

本章教程,主要介绍如何在Windows操作系统上,下载并配置GO语言环境变量。 Go(又称为Golang)是一种开源的编程语言,由Google开发,于2009年首次公开发布。它旨在提供简洁、高效、可靠的软件开发解决方案。Golang是一种静态强类型、编译型语言,Golang具有很强的表达能力,得…

【Linux网络(五)】传输层协议

目录 1、UDP协议 1.1、UDP报头 2、TCP协议 2.1、tcp协议段格式 2.2、TCP三次握手的过程 2.3、TCP四次挥手的过程 2.4、流量控制 2.5、滑动窗口 2.6、延迟应答 2.7、拥塞控制 2.8、面向字节流 2.9、数据粘包 2.10、TCP连接异常问题 1、UDP协议 学习目标&#xff1a…

第十二:josn 传递参数 shouldBindJSON 和结构体的 db字段

链接&#xff1a; Golang教程三&#xff08;结构体、自定义数据类型&#xff0c;接口&#xff09;_golang 自定义数据类型-CSDN博客 结构体指向 json 和数据库的 db type User struct { ID int json:"id" db:"user_id" Name string json:…

Retinexformer:基于 Retinex 的单阶段 Transformer 低光照图像增强方法

开头发点牢骚&#xff1a;本来做的好好都都要中期了&#xff0c;导师怎么突然给我换题目啊。真是绷不住了......又要从头开始学了&#xff0c;唉&#xff01; 原论文链接&#xff1a;Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement 低光…

游戏引擎学习第182天

回顾和今天的计划 昨天的进展令人惊喜&#xff0c;原本的调试系统已经被一个新的系统完全替换&#xff0c;新系统不仅能完成原有的所有功能&#xff0c;还能捕获完整的调试信息&#xff0c;包括时间戳等关键数据。这次的替换非常顺利&#xff0c;效果很好。 今天的重点是在此基…

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面 今天写一下使用nodejs作为服务端&#xff0c;vue作为客户端&#xff0c;mysql的数据库&#xff0c;对接deepseek的全过程&#xff0c;要实现一个很简单的效果就是&#xff0c;可以自由的询问&#xff0c;然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…

Git 提示 “LF will be replaced by CRLF“ 的原因及解决方案

遇到的问题: warning: in the working copy of build/build.js, LF will be replaced by CRLF the next time Git touches it warning: in the working copy of build/check-versions.js, LF will be replaced by CRLF the next time Git touches it warning: in the worki…

Axure设计之中继器表格——拖动列调整位置教程(中继器)

一、原理介绍 实现表格列的拖动排序&#xff0c;主要依赖Axure的动态面板和中继器两大核心功能&#xff1a; 动态面板交互控制 将表格的列标题封装在动态面板中&#xff0c;通过拖拽事件&#xff08;开始、移动、结束&#xff09;捕捉用户操作 在拖拽过程中实时计算鼠标位置&…

IDEA工具使用之启动项目失败且无日志打印

IDEA工具使用之启动项目失败且无日志打印 问题描述原因分析解决方案方案一&#xff1a;使用类路径缩短方案&#xff08;推荐&#xff09;方案二&#xff1a;修改启动配置 总结 问题描述 概述 新拉取的项目&#xff0c;基于IDEA本地调试启动失败&#xff0c;控制台也没有跳转打…

GC overhead limit exceeded---Java 虚拟机 (JVM) 在进行垃圾回收内存量非常少解决

背景&#xff1a; 我正在跑一个数据处理较为复杂的程序。然后调试了很多遍&#xff0c;出现了GC问题&#xff0c;如下图bug. GC overhead limit exceeded-这个bug错误通常表示 Java 虚拟机 (JVM) 在进行垃圾回收时花费了过多的时间&#xff0c;并且回收的内存量非常少。…

SAP GUI Script for C# SAP脚本开发快速指南与默认主题问题

SAP GUI Script for C# 快速指南 SAP 脚本的快速使用与设置. 解决使用SAP脚本执行后,默认打开的SAP是经典主题的问题 1. 解决默认主题问题 如果您使用的是SAP GUI 740,并遇到无法打开对话框的问题,请先将主题设置为经典主题(Classic Theme),应用更改后重新打开SAP GUI …

测试用例`

1.什么是测试用例 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素. 2.测试用例的万能公式(重点) 设计测试⽤例的万能公式&#xff1a; 功能测试界…

【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署

【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…

Qt:QWebEngineView显示网页失败

今天在新电脑搭建qt开发环境&#xff0c;在运行程序时发现通过QWebEngineView显示的html失败&#xff0c;同样的代码在旧电脑上没有这个问题 分析过程 &#xff08;1&#xff09;qt出现如下信息提示 [21296:12076:0325/161831.084:ERROR:platform_handle_in_transit.cc(34)] …

第十六届蓝桥杯模拟二(串口通信)

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

uni-app页面怎么设计更美观

顶部 页面最顶部要获取到手机设备状态栏的高度&#xff0c;避免与状态栏重叠或者被状态栏挡住 // 这是最顶部的父级容器 <view :style"{ paddingTop: ${statusBarHeight extraPadding}px }">.... </view> export default {data() {return {statusBarH…