JVM原理(三):JVM对象回收判定机制与回收算法

news2024/11/18 8:24:48

如何判断一个对象是否存活(即是否还分配在堆中),那看他是否还在用。

1. 引用计数算法

这是一种判断方式,相应的方法就是:如果一个对象被引用,那将被引用的对象中的一个计数器加一,引用失效就减一。在任何时刻引用计数器为0那就是没有应用的话,那该对象就可被回收了。

存在着的缺陷:当两个对象相互引用的时候,就会造成一种循环,引用计数器无法判断他们是否还有用。

Java虚拟机不用这种。

2. 可达性分析算法

通过“GC Roots”的跟对象作为起始节点集,从这些结点开始,根据应用关系向下搜索,搜索过程中走过的路径叫做引用链,如果某个对象(或某个对象链)不在引用链上,会被标记为可回收对象(关于是否可以真正回收可以查看3.2.4)。

被固定可作为GCRoot对象有以下几种:

  • 虚拟机栈中引用的对象

  • 静态属性引用对象

  • 常量引用对象

  • 本地方发展中Native方法引用的对象

  • 一些常驻的异常对象

  • 被同步锁持有的对象

  • 反应Java虚拟机内部信息的对象(一些工具)

3. 再谈引用

无论是引用计数算法还是可达性分析算法判断对象是否可以被回收,我们都离不开引用的关系。

JDK1.2版本:强引用、软引用、弱引用、虚引用

强引用:是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象

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

弱引用:也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2版之后提供了WeakReference类来实现弱引用。

虚引用:也称为“幽灵引用”或者“幻影引用”,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得--一个对象实例。为-一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器凹收时收到一个系统通知。在JDK1.2版之后提供了PhantomReference类来实现虚引用。

4. 生存还是死亡?

可达性算法补充。

可达性算法判定为不可达对象后,这个对象还不是“非死不可”,这个对象要真正死亡,还需要至少经历两次标记过程。

第一次标记:可达性分析算法发现没有和GC Root相连,会被第一次标记。

中间流程:如果对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用了,那么虚拟机就会直接调用(finalize方法只能被执行一次)。

第二次标记:如果该对象finalize方法判定为有必要执行,那就会把该对象放到F-Queue队列中。finalize方法是对象逃脱死亡命运的最后一次机会,如果这时候该对象和GC Root上的引用链连接上了,那么就可以逃脱被回收的命运,不然就会被回收。

5. 回收方法区

方法区的垃圾收集主要回收两部分内容:废弃的常量和不再使用的类型。

判断常量是否可以被回收:

  1. 没有任何字符串对象引用该常量,且虚拟机中也没有其他地方引用这个字面量。

判定一个类型是否属于“不再被使用的类”:

  1. 该类所有的实例都已被回收,也就是Java堆中不存在该类及其任何派生子类的实例。

  2. 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,否则通常很难达成的。

  3. 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数千万“四高”中老年患者,如何推动国产营养保健品创新

“三高”指高血压、高血糖(糖尿病)、高血脂,是中老年群体的常见病。 然而,除了前述三者,高尿酸血症在我国的患病率正逐年提高,已成为仅次于糖尿病的第二大代谢性疾病。痛风是高尿酸血症典型症状之一。 加上…

Lesson 48 Do you like ... ? Do you want ... ?

Lesson 48 Do you like … ? Do you want … ? 词汇 fresh a. 新鲜的【食物】 搭配:fresh water 淡水    fresh man 新生    fresh air 新鲜空气    fresh egg 新鲜鸡蛋 例句:我们喜欢新鲜的空气。    We like fresh egg. egg n. 蛋【通…

电容的常用用法

1.降压,其实就是用电容去分压,没什么好说的 2.滤波,高频信号下,电容的容抗非常小,所以说容易让高频信号通过电容,而低频信号下电容容抗大,从而能够滤出高频信号 3.延时,电容充放电需…

优思学院与你探索六西格玛:从统计术语到现代质量管理方法

六西格玛,这个源自统计学的术语,已经在质量管理领域掀起了一场革命。然而,很多初学者,包括参加优思学院六西格玛课程的学生,常常对其真正的意义感到困惑。本文将带领大家深入了解六西格玛,从其统计学起源到…

Node.js的下载、安装和配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

SpringBoot 启动流程四

SpringBoot启动流程四 前面这个创建对象是初始化SpringApplication对象 是加载了SpringBoot程序的所有相关配置 我们接下来要将这个run方法 run过程是一个运行 初始化容器 我们看我们的运行结果是得到一个ConfigurableApplicationContext对象 package com.bigdata1421.star…

ChatMoney:AI看病,私人医生不是梦想!

本文由 ChatMoney团队出品 在当今这个科技飞速发展的时代,人工智能技术正在以惊人的速度改变着我们的生活,人工智能已经深入到各个领域,医疗行业也不例外。 而今天我要和大家聊一聊利用ChatMoney全能知识库AI系统在求医问诊领域所发挥的巨大…

Elasticsearch实战教程:如何使用集群索引数据来进行统计多个数据?

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 Elasticsearch聚合查询是一种强大的工具,允许我们对索引中的数据进行复杂的统计分析和计算。本文将详细解释一…

【分布式系统五】监控平台Zabbix实际监控运用(命令+截图详细版)

目录 一.Zabbix 监控 Windows 1.安装zabbix 2.Web 页面添加主机,关联模板 二.Zabbix 监控 Java 应用 1.安装tomcat 2.服务端安装 zabbix-java-gateway 3.Web 页面添加主机,关联模板 三.Zabbix 监控 SNMP 1.服务端安装 snmp 监控程序 2.修改 sn…

小型全自动气象站的知识分享

TH-QC5小型全自动气象站具有便携式一体化结构设计,外形美观,安装方便简捷,可靠运行于各种恶劣的野外环境。它能够实时监测温度、湿度、风速、风向、雨量、气压、光照等多种气象参数,并且这些气象观测要素的配置方式可以根据项目的…

stm32定时器与pwm波

文章目录 4 TIM4.1 SysTick系统定时器4.2 TIM定时器中断与微秒级延时4.3 TIM使用PWM波4.3.1 PWM介绍4.3.2 无源蜂鸣器实现 4.4 TIM ,PWM常用函数 4 TIM 4.1 SysTick系统定时器 ​ Systick系统滴答,(同时他有属于自己的中断,可以利用它来做看…

OceanMind海睿思成功举办“数据要素×人工智能” 研讨会,荣获上海数交所授牌

近日,由南京东南人工智能产业链供应链创新链党建联盟、上海数据交易所主办,中新赛克承办的“数据要素人工智能”行业应用研讨会在南京成功举办。 本次活动是东南人工智能产业链供应链创新链党建联盟2024年度“人工智能人才服务行动项目”第二期活动。会议…

环境检测聚四氟乙烯微波消解罐 特氟龙反应釜 适用于COD测定

COD消解罐是实验室中用于测定水样中化学需氧量(Chemical Oxygen Demand,简称COD)的一种专用设备。化学需氧量是衡量水体污染程度的一个重要参数,它表示在一定条件下,水样中的有机物质和部分无机物质被氧化的程度。以下…

linux——小细节(Makefile)(gdb)

一、makefile a.out:main.c func.cgcc main.c func.cclean:rm a.out a.out:main.c func.cgcc $^ -o $clean:rm a.out SRCmain.c func.c OBJa.out CCgcc FLAG -g -lpthread $(OBJ):$(SRC)$(CC) $(SRC) $(FLAG)clean:rm $(OBJ) 二、gdb

玩客云刷Armbian安装docker、alist、OpenWrt、Aria2等教程及所需文件(内容详细)

这篇教程主要是本人在这里面踩的坑比较多,网上的教程很多,感觉都不太详细,分享一下自己的经验。 注意本教程的图片都是后期补的,可能与原文内容不符,仅供参考,图片里面会出现小雅,memos笔记&am…

记录第一次写脚本

使用csh语言,Linux系统操作的 写和执行csh(C Shell)脚本不需要额外的软件,只需要一个支持csh的终端环境。 1.检查是否安装了C Shell 在终端terminal运行以下命令 which csh 如果返回路径,比如/bin/csh&#xff0c…

昇思25天学习打卡营第17天|GAN图像生成

模型简介 GAN模型的核心在于提出了通过对抗过程来估计生成模型这一全新框架。在这个框架中,将会同时训练两个模型——捕捉数据分布的生成模型G和估计样本是否来自训练数据的判别模型D 。 在训练过程中,生成器会不断尝试通过生成更好的假图像来骗过判别…

怎么在表格后添加文字行行

Ctrl Shift 回车 解决方案 在表格末尾添加一行(表格行)。 (此时光标应该默认在这个新行中,如果没有,自己手动点一下) 按 Ctrl Shift 回车 将此行与前面的表格拆分开,中间会出现一个空文本行…

离散傅里叶变换(Discrete Fourier Transform,DFT)

离散傅里叶变换(Discrete Fourier Transform,DFT)是信号分析中的一种基本方法,它将离散时序信号从时间域变换到频率域,是傅里叶变换在时域和频域都呈现离散的形式。以下是关于离散傅里叶变换的详细介绍: 一…

尽量不写一行if...elseif...写出高质量可持续迭代的项目代码

背景 无论是前端代码还是后端代码,都存在着定位困难,不好抽离,改造困难的问题,造成代码开发越来越慢,此外因为代码耦合较高,总是出现改了一处地方,然后影响其他地方,要么就是要修改…