【JVM】如何判定一个对象已死以及“标记-清除”、“标记-复制”、“标记-整理”三种垃圾收集算法

news2025/1/17 13:54:28

文章目录

  • 0、如何判定一个对象的生死?
  • 1、上文提到的引用又是什么
    • 1、强引用:
    • 2、软引用:
    • 3、弱引用:
    • 4、虚引用:
  • 2、垃圾收集算法
    • 1、标记-清除
    • 2、标记-复制
      • 优化:👇
    • 3、标记-整理

0、如何判定一个对象的生死?

引用计数器算法:在JDK1.2之前,使用的是引用计数器算法。
在对象中添加一个引用计数器,每当有地方引用这个对象的时候,引用计数器的值就+1,当引用失效的时候,计数器的值就-1,当引用计数器被减为零的时候,标志着这个对象已经没有引用了,可以回收了!

使用可达性算法分析:通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的(对象已死

1、上文提到的引用又是什么

java中将引用分为 强引用、软引用、弱引用、虚引用。

1、强引用:

强引用是最普遍的一种引用, 如果一个对象具有强引用,那垃圾回收器绝不会回收它。

2、软引用:

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

3、弱引用:

只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

4、虚引用:

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。

2、垃圾收集算法

1、标记-清除

标记-清除算法分为两个阶段:标记阶段和清除阶段。

  • 标记阶段的任务是标记出所有需要被回收的对象。
  • 清除阶段就是回收被标记的对象所占用的空间。
    在这里插入图片描述
    标记-清除算法比较基础,但是主要存在两个缺点:
  • 执行效率不稳定,如果 Java 堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。
  • 内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

2、标记-复制

标记-复制算法解决了标记-清除算法面对大量可回收对象时执行效率低的问题。

它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象,复制到另外一块上面,然后再把已使用的内存空间一次清理掉。分配内存时,只要移动堆顶指针,按顺序分配即可,这样一来就不容易出现内存碎片的问题。
在这里插入图片描述
这种算法实现简单,运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。
新生代垃圾收集主要采用这种算法,因为新生代的存活对象比较少,每次复制的只是少量的存活对象。

优化:👇

实际中,把新生代分为一块较大的Eden空间和两块较小的 Survivor空间,比例是8:1:1,每次分配内存只使用Eden和其中一块Survivor。发生垃圾收集时,将Eden和其中一块Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。新生代的垃圾收集主要采用标记-复制算法,因为新生代的存活对象比较少,大多是“朝生夕死”,每次复制少量的存活对象效率比较高。

3、标记-整理

为了降低内存的消耗,引入一种针对性的算法:标记-整理(Mark-Compact)算法。

其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。
在这里插入图片描述
标记-整理算法主要用于老年代,移动存活对象是个极为负重的操作,而且这种操作需要 Stop The World 才能进行,只是从整体的吞吐量来考量,老年代使用标记-整理算法更加合适。

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

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

相关文章

2023雷军年度演讲听后感

(点击即可收听) 2023雷军年度演讲-文字完整版 2023年8月14号晚,雷军的第四次演讲,热些沸腾 相比前三次演讲,第一次在2020 年 8 月 11 日,以“相信自己,一往无前”为主题进行了分享,第二次,第三次分别是在2021 年和 202…

node 版本与 node-sass node-loader 版本的对应关系

node 版本与 node-sass 版本的对应关系: 其一、查看文档的地址: https://www.npmjs.com/package/node-sass 其二、对应关系的表格: 对应版本 node16 “node-sass”: “6.0.1” “sass-loader”: “10.2.0” node: v14.19.0; node-sass: ^4…

【js】js中apply()、bind()、call()用法

这三个方法的作用基本上相同,用法上有一些不同,下面先对比一下它们的用法: apply:调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。 语法: ap…

allure相关笔记

allure.epic:最高级别的分类,表示一个大的功能、模块或业务场景。功能模块 allure.feature:表示一个功能模块或业务子场景,位于史诗下。主流程 allure.story:表示一个具体的测试场景,位于特性下。具体主流程…

分享几个自己常用的JS库加快开发效率

分享经常用的几个js库,主要涉及到前端的视频播放(直播)、时间格式化、时间范围选择、连续翻滚、防抖等js库。可以很好的解决前端的一些问题。 1.videojs 是一个通用的在网页上嵌入视频播放器的 JS 库,Video.js 自动检测浏览器对 …

零代码新思路,基于LogicFlow的页面逻辑编排

在滴滴客服业务里,通过零代码的方式来配置页面已有丰富的落地经验,大大提高了服务用户的效率和质量。但是传统零代码在页面逻辑配置上表现并不好,很难做到灵活扩展。因此,滴滴客服技术团队探索出一种新思路,用流程编排…

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途: ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器,用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等;室内使用效果均佳。 产品特点&#xff…

多传感器外参标定

文章目录 lidar和imu标定code: [https://gitcode.net/weixin_42990464/calib_lidar_imu](https://gitcode.net/weixin_42990464/calib_lidar_imu)code: [https://github.com/APRIL-ZJU/lidar_IMU_calib](https://github.com/APRIL-ZJU/lidar_IMU_calib) lidar和imu标定 code: …

WORD如何调整表格的宽度

目录 1. 调整表格宽度 1. 调整表格宽度 如下图,要求将文档中的表格宽度调整到2厘米。 点击选中要调整的表格,依次点击【布局】-【属性】选项。 如下图,通过上一个步骤的操作,系统弹出表格属性对话框。 在弹出的【表格属性】对话框…

尚硅谷MySQL笔记 3-9

我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种,大致了解下即可 DDL(Data Definition Languages、数据定义语言),定义了…

DRF的限流组件(源码分析)

限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷。 对于匿名用户,使用用户IP作为唯一标识。对于登录用户,使用用户ID或名称作为唯一标识。 缓存{用户…

图文结合丨带你轻松玩转MySQL Shell for GreatSQL

一、引言 1.1 什么是MySQL Shell ? MySQL Shell 是 MySQL 的一个高级客户端和代码编辑器,是第二代 MySQL 客户端。第一代 MySQL 客户端即我们常用的 MySQL 。除了提供类似于 MySQL 的 SQL 功能外,MySQL Shell 还提供 JavaScript 和 Python 脚本功能&a…

免费开源服务器资源监控系统grafana+prometheus+node_exporter

有项目做测试的时候需要查询服务器资源利用情况,自己又没写相应的模块,此时就需要一套好用的资源监控系统,,咨询了运维人员给推荐了一套,装完后真的很好用。 就是grafanaprometheusnode_exporter(linux&am…

Python项目实战:将3D灰度图像转换为3D彩色图像

文章目录 (3D-GRAY) to (3D-RGB):使用颜色映射的方式,将灰度值映射到彩色空间中的特定颜色。一、多维数组:10x12x14(1)channel重复:在RGB中,将【灰度图】分别赋值给【R/G/B图】,显示…

NPM与外部服务的集成(下)

目录 1、撤消访问令牌 2、在CI/CD工作流中使用私有包 2.1 创建新的访问令牌 持续整合 持续部署 交互式工作流 CIDR白名单 2.2 将令牌设置为CI/CD服务器上的环境变量 2.3 创建并签入特定于项目的.npmrc文件 2.4 令牌安全 3、Docker和私有模块 3.1 背景:运…

类加载器与反射

类加载器,反射 1.类加载器 1.1类加载器【理解】 作用 负责将.class文件(存储的物理文件)加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例(对象)调用类的类方法访问类或者接口的类变量&#xff0…

如何做好项目进度管理,项目经理可以这样做

项目追踪是通过把控项目的进度、成员的任务完成情况,以及项目计划进展等方面来进行的。项目经理在进行项目进度跟踪时,主要从以下三个方面进行: 1、制定并完善项目计划 项目经理使用进度猫等工具制定项目计划,通过甘特图对项目…

将Excel表格复制到Word文档中

目录 方式1:粘贴 -> 保留源格式(CtrlV的默认行为)参考文献 方式1:粘贴 -> 保留源格式(CtrlV的默认行为) 保留源格式是Word在粘贴来自其他程序内容时的默认行为(直接CtrlV)。如…

解决右键打印html只能识别1页的问题

hello,大家好久不见,昨天在开发中遇到了一个问题,就是在自己开发的网页中右键-->打印,由于页面内容过多,打印出来的内容只被识别到一页。 针对这一问题,查阅了好多资料最终解决啦。 1.问题重现 大家可以看到这个是我们开发的页面,公司需要…

.netcore grpc的proto文件字段详解

一、.proto文件字段概述 grpc的接口传输参数都是根据.proto文件约定的字段格式进行传输的grpc提供了多种类型字段;主要包括标量值类型(基础类型)、日期时间、可为null类型、字节、列表、字典、Any类型(任意类型)、One…