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

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

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.mzph.cn/news/866635.shtml

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

相关文章

CY3-Biotin在细胞成像中的应用

星戈瑞单品CY3-Biotin是一种结合了荧光染料CY3和生物素(Biotin)的荧光探针,它在细胞成像技术中扮演科研角色。以下是CY3-Biotin在细胞成像中的几个主要应用: 蛋白质标记与追踪 CY3-Biotin常被用来标记那些与生物素亲和性高的蛋白…

STM32自己从零开始实操07:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感:通低频阻高频的。仿真中高频信号通过电感,因为电感会阻止电流发生变化,故说阻止高频信号 电容:隔直通交。…

免费分享:中国三级及以上河流(附下载方法)

河流分级法的分级方法是从源头最小河流开始,称为一级河流;两条一级河流汇合成二级河流;以此类推,三级河流等等;最后是干流。本文将介绍中国三级及以上河流数据。 数据简介 1:100万中国三级及以上河流矢量数据是涵盖了全国范围内三级及以上级别河流的详细地理信息和空间分布。这…

App Store迎来了重磅更新,ASO冲榜优化或将成为不可或缺的一部分

近日App Store搜索页面迎来了重磅更新,苹果应用商店中搜索页面原有的热搜关键词消失了取而代之的是直接将排行榜放在了搜索顶部,分别是APP排行和游戏排行两部分。如下图: 很多人应该都是参考排行榜来下载APP的,这次更新之后用户在…

C语言标准库中的函数

由于C语言标准库中的函数非常多,我将按类别列出一些常见函数及其作用。请注意,这里不可能列出所有函数,但我会尽量覆盖主要的类别和函数。 ### 标准输入输出 - printf: 格式化输出到标准输出(通常是屏幕)。 - scanf: …

oracle中两个检查表结构的方法

在Oracle数据库中,检查表结构是数据库管理和开发中的常见需求。以下是两种常用的检查表结构的方法: 1. 使用DESCRIBE命令或DESC命令 方法描述: 在SQL*Plus命令行界面或SQL Developer等Oracle数据库管理工具中,可以使用DESCRIBE…

基于工业互联网的智能制造:未来制造业的新引擎

随着科技的飞速发展,工业互联网通过提供强大的数据支撑和通信基础,成为智能制造的重要基石。智能制造的引入,不仅显著提升了制造业的生产效率、降低了成本,而且提高了产品质量,满足了市场的多样化、个性化需求。 智能制…

浔川音乐报(暮色回响)(第一期24.7.5)——浔川音乐报

1 本期推荐歌曲: 《暮色回响》 2 介绍: 是T1作词、作曲 演唱:吉星出租 发行时间: 2024年5月17日 (现已有多个翻唱版本) 3 歌词: 传说浩瀚银河有颗星是他 走出时间后仍然选择留下 漆昼中温柔的不…

解决问题:使用PageHelper.startPage和PageInfo实现分页,但是得到的total和传入的页面大小pageSize一样

我们需要的是total得到的数值是数据库里所有数据的条数。 1、包别引错 <!--PageHelper开始--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</…

kafka 生产者

生产者 生产者负责创建消息&#xff0c;然后将其投递到Kafka中。 负载均衡 轮询策略。随机策略。按照 key 进行hash。 Kafka 的默认分区策略&#xff1a;如果指定了 key&#xff0c;key 相同的消息会发送到同一个分区&#xff08;分区有序&#xff09;&#xff1b;如果没有…

光伏储能电厂设备连接iec61850平台解决方案

在当今日益发展的电力系统中&#xff0c;光伏储能技术以其独特的优势逐渐崭露头角&#xff0c;成为可再生能源领域的重要组成部分。而在光伏储能系统的运行与监控中&#xff0c;通信协议的选择与实现则显得至关重要。本文将重点介绍光伏储能系统中的Modbus协议、电力IEC 61850平…

reids一主多从配置

-----------------跳过了安装redis的过程--------------------------- 主192.168.25.129从 192.168.25.130从 192.168.25.133 redis主从复制环境&#xff0c;基本上都是在从服务器上修改相关的配置 1、在俩台从服务器分别给 reids.conf文件添加master…

【深度学习练习】心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是RNN RNN与传统神经网络最大的区别在于&#xff0c;每次都会将前一次的输出结果&#xff0c;带到下一隐藏层中一起训练。如下图所示&#xff1a; …

Docker 运行Nacos无法访问地址解决方法

参考我的上一篇文章去配置好镜像加速器&#xff0c;镜像加速器不是配置越多越好&#xff0c;重试次数多了会失败 Dockerhub无法拉取镜像配置阿里镜像加速器-CSDN博客 错误的尝试 最开始按照网上的方式去配了一大堆&#xff0c;发现下不下来。 镜像源地址&#xff1a;https:…

文件格式是.pb应该怎么查看?

文件格式为.pb的文件&#xff0c;通常是Google Protocol Buffers&#xff08;简称PB&#xff09;序列化后的二进制文件。要查看.pb文件的内容&#xff0c;可以采用以下方法&#xff1a; 1. **直接打开&#xff08;不推荐&#xff09;**&#xff1a; - 直接打开.pb文件通常会显示…

Oracle 解决4031错误

一、问题描述 什么是4031错误和4031错误产生的原因: 简单一个句话概括: 由于服务器一直在执行大量的硬解析,导致Oracle 的shared pool Free空间碎片过多,大的chunk不足, 当又一条复杂的sql语句要硬解析时, 缺少1个足够大的Free chunk, 通常就会报4031错误. 二、解决方法 临…

模拟退火算法4—应用

TSP&#xff08;旅行商&#xff09;问题是最有代表性的优化组合问题之一&#xff0c;其应用已逐步渗透到各个技术领域和我们的日常生活中.它一开始是为交通运输而提出的&#xff0c;比如飞机航线安排、送邮件、快递服务、设计校车行进路线等等.实际上其应用范围扩展到了许多其他…

mysql 版本号字符串字段比对大小并取出集合列表

在MySQL中&#xff0c;可以使用SUBSTRING_INDEX函数来分割版本号字符串并进行比较。以下是一个示例&#xff0c;假设我们有一个名为sys_version的表&#xff0c;其中包含一个名为version的字段&#xff0c;我们想要找出所有大于指定版本号4.2.1的记录。 SELECT* FROM(SELECTve…

揭秘数据之美:【Seaborn】在现代【数学建模】中的革命性应用

目录 已知数据集 tips 生成数据集并保存为CSV文件 数据预览&#xff1a; 导入和预览数据 步骤1&#xff1a;绘制散点图&#xff08;Scatter Plot&#xff09; 步骤2&#xff1a;添加回归线&#xff08;Regression Analysis&#xff09; 步骤3&#xff1a;分类变量分析&…