【jvm】如何判断一个对象是否可以回收

ops/2024/11/18 21:44:44/

目录

        • 1.引用计数法
          • 1.1 原理
          • 1.2 缺点
        • 2.可达性分析算法
          • 2.1 原理
          • 2.2 GC Roots
          • 2.3 标记-清除阶段
        • 3.引用类型

1.引用计数法
1.1 原理
  • 1.为每个对象创建一个引用计数,当有对象引用该对象时,计数器加1。
  • 2.当引用失效时,计数器减1。
  • 3.当计数器的值为0时,表示该对象没有被任何对象引用,因此可以被回收。
1.2 缺点
  • 1.引用计数法存在循环引用的问题。
  • 2.如果两个对象相互引用,它们的引用计数将不会为0,导致无法回收,进而造成内存泄漏。
  • 3.JVM中的主流垃圾回收器通常不单独使用这种方法。
2.可达性分析算法
2.1 原理
  • 1.可达性分析算法是JVM判断对象是否可回收的核心算法。
  • 2.它从一组称为GC Roots的根对象开始,通过递归方式遍历引用图,判断哪些对象是可达的,哪些是不可达的。
  • 3.如果一个对象从GC Roots无法到达,则该对象被视为不可达,可以被垃圾回收。
2.2 GC Roots
  • 1.GC Roots是可达性分析算法的起点,包括以下几种对象:
  • 2.栈帧中的局部变量:当前正在执行的方法中的所有局部变量和参数。
  • 3.方法区中的静态变量:所有类的静态属性(类变量)和常量引用的对象。
  • 4.本地方法栈中的JNI(Java Native Interface)引用:通过JNI调用的本地代码中持有的对象引用。
  • 5.活动线程:正在运行的线程本身也被视为GC Roots。
2.3 标记-清除阶段
  • 1.可达性分析算法通常分为标记清除两个阶段:
  • 2.标记阶段:从GC Roots开始遍历所有可达的对象,并进行标记。JVM会使用一个标志位来标记对象是否可达。
  • 3.清除阶段:在标记完成后,JVM遍历堆中的所有对象,将未被标记的对象视为垃圾,清除这些对象所占用的内存。
3.引用类型
  • 1.在进行可达性分析时,JVM还考虑了不同的引用类型,这些引用类型决定了对象的可达性及其回收时机。
  • 2.强引用:强引用是Java中的默认引用类型。只要一个对象有强引用存在,垃圾回收器就不会回收它。
  • 3.软引用:使用SoftReference类表示。只有在内存不足时,JVM才会回收被软引用持有的对象。软引用通常用于实现内存敏感的缓存。
  • 4.弱引用:使用WeakReference类表示。只要垃圾回收器发现一个对象只被弱引用持有,就会回收该对象。弱引用主要用于实现规范化映射,如WeakHashMap。
  • 5.虚引用:使用PhantomReference类表示。虚引用是最弱的一种引用,无法通过虚引用访问对象。虚引用的存在主要用于跟踪对象被垃圾回收的状态,可以在对象被回收后执行一些清理操作。

http://www.ppmy.cn/ops/134794.html

相关文章

1. kafka分布式环境搭建

一. 集群规划 主机名IP组件hadoop1192.168.205.154zookeeper, kafkahadoop2192.168.205.155kafkahadoop3192.168.205.156kafka kafka版本:3.6.0二. 集群部署 安装JDK,具体安装过程此处不赘述。 安装zookeeper,本次采用单机模式部署在hadoo…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌(田忌赛马) 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励&#…

web——upload-labs——第三关——后缀黑名单绕过

上传一个正常的一句话木马,判断一下验证类型 响应后返回提示不允许上传.asp,.aspx,.php,.jsp后缀文件! 且查看网页源代码中并没有前端验证机制,所以可以判断这道题是后端验证 使用burp 提示无法上传.php结尾的文件,但我们的一句…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后,app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

基于Java Springboot宠物流浪救助系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库:MySQL…

web3+web2安全/前端/钱包/合约测试思路——尝试前端绕过直接上链寻找漏洞

0x01 前言 DEFI APP会存在许多的前端限制,原因是一些项目常常会有多种多样的限制,然而DEFI APP有别于传统的JAVA后端语言,DAPP有自己独属于区块链特性,能够直接交互上链且上链后不可篡改特征也让DAPP上线前往往更加严格,在前端的…

c++数字雨实现

‌数字雨‌是一种视觉效果,通常出现在黑客电影中,表现为屏幕上不断下落的数字和字符,营造出一种科技感和动态效果。‌12 数字雨的实现方法 ‌编程实现‌:可以使用C/C编程语言来实现数字雨效果。通过定义一个字符串数组&#xff0…

数据结构中的抽象数据类型、逻辑结构、存储结构等到底是什么?

在学习数据结构的过程中,我们经常会遇到一些抽象的术语,例如“抽象数据类型”(Abstract Data Type,简称ADT)、“逻辑结构”以及“存储结构”。这些概念对非计算机专业的小白来说或许有些难以理解,因此本篇文…