JVM - 垃圾回收机制

JVM的垃圾回收机制(简称GC)

        JVM的垃圾回收机制非常强大,是JVM的一个很重要的功能,而且这也是跟对象实例息息相关的,如果对象实例不用了要怎么清除呢?

如何判断对象已经没用了

当JVM认为一个对像已经没用了,就会把这个对象判定为是垃圾,就会去回收它的空间,有两个方法判断一个对像是否已经没用了

1、引用计数法:记录指向该对象的引用数,当该数值为零时就将该对象判定为垃圾

这个方法实现简单,判定效率也高,不过它有个致命的问题,它无法解决相互对象之间相互循环引用的问题,看下面这个例子

​
public class Test {public Object object = null;public static void main(String[] args) {Test a = new Test();//对象1Test b = new Test();//对象2a.object = b;b.object = a;a = null;b = null;}
}​

此时对象1和对象2除了对方指向自己的引用外,没有其他的引用了,这个时候,无论是对象1还是对象2,我们认为都已经没用了,因为程序是找不到它俩的,但是引用计数法无法将它们判定为垃圾,因为它们的被引用数不是为零

正是因为这个缺点,主流的java虚拟机都不会使用该判定方法

2、可达性分析:

选定一些满足特定条件的对象作为根对象(GC Roots),那些与跟对象存在直接或间接引用关系的就是有用的对象,而与根对象没有任何关联的对象,就是垃圾对象(如下图)

可达性分析是当今主流的判定机制

GC的分类

Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的,所以Minor GC非常频繁,一般回收速度也比较快。

Major GC是老年代GC,指的是发生在老年代的GC,通常执行Major GC会连着Minor GC一起执行。Major GC的速度要比Minor GC慢的多。

Full GC是清理整个堆空间,包括年轻代和老年代(Minor GC和Major GC一起执行就是Full GC)

GC和分代的关系

那么现在我们就知道了为什么要分代了:

对象实例一般会首先分配到新生代当中,当新生代当中的空间不够用的时候,就会触发Minor GC,这个时候就会有一些没用的对象实例被清除掉,而有些就会留下来,那些能够挺过一定次数Minor GC的对象,最后就会进入到老年代当中,如果老年代中的空间也不够用了,那么就会进行Major GC

回收算法

我们上面说到GC会对垃圾进行回收,那具体要这么回收呢?这个就是回收算法,目前有三种回收算法,分别是:标记-清除、标记-复制、标记-整理

标记-清除

看下面的示意图,这个代表堆中的某块空间(可以是年轻代或老年代),每个紫色方块就是一个对象,上面我们说,JVM的对象是否存活的判定方法是可达性分析,所有那些没被GC Root引用的就要给标记成垃圾对象,标记完后再统一进行回收,这会造成内存空间碎片化的问题

 

标记-复制

将堆区分为两块区域,先只在其中一块区域创建对象,垃圾回收的时候,先标记出那些不要被回收的对象,然后将其复制到另外一块区域中,然后清空原本那块区域,新生代使用的就是标记-复制算法,新生代分为一块较大的Eden空间和两块较小的 Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。这里存在一个问题,当存活的对象的总大小大于那块Survivor空间,那就会造成溢出,而那些溢出的对象,会直接进入老年代,这叫分配担保

 标记-整理

标记-复制算法存在需要额外空间进行分配担保的问题,新生代有老年代做分配担保,那老年代没人做分配担保就没办法使用标记-整理算法,要使用标记-整理算法,同样是先进行标记,不过不马上进行回收,而是让所有的存活对象都向内存空间一端移动,然后直接清理掉边界以外的堆空间

标记-整理存在一个弊端,在整理的过程中,必须全程暂停用户应用程序,这个被形象地称为“Stop The World”,实际上只要对象的存储地址发生了改变,就会“Stop The World”,所以标记-复制算法也会“Stop The World”

 

垃圾收集器

垃圾回收算法是理论层面,真正的垃圾回收执行者是垃圾收集器,关于垃圾收集器我整理了另外一篇博客,地址:http://t.csdn.cn/2ypGh

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

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

相关文章

初识Sentinel

目录 1.解决雪崩的方式有4种: 1.1.2超时处理: 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …

== 和 equals 的对比 [面试题]

和 equals 的对比[面试题] 文章目录 和 equals 的对比[面试题]1. 和 equals 简介2. Object 类中 equals() 源码3. String 类中 equals() 源码4. Integer 类中 equals() 源码5. 如何重写 equals 方法 1. 和 equals 简介 是一个比较运算符 :既可以判断基本数据类型…

【数据结构OJ题】链表的回文结构

原题链接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 在做这道…

老师如何制作二维码分班查询系统?技术老师分享的创建框架值得借鉴

作为一名班主任,开学前需要搞定分班问题,可以通过制作一个分班二维码查询系统,让学生和家长可以通过扫描二维码快速查到自己的分班信息,分享一下我制作的过程,希望对老师们有帮助(结尾有惊喜)&a…

内网穿透——使用Windows自带的网站程序建立网站

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助,比如…

RP2040开发板自制树莓派逻辑分析仪

目录 前言 1 准备工作和前提条件 1.1 Raspberry Pi Pico RP2040板子一个 1.2 Firmware-LogicAnalyzer-5.0.0.0-PICO.uf2固件 1.3 LogicAnalyzer-5.0.0.0-win-x64软件 2 操作指南 2.1 按住Raspberry Pi Pico开发板的BOOTSEL按键,再接上USB接口到电脑 2.2 刷入…

End-to-End Object Detection with Transformers

DERT 目标检测 基于卷积神经网络的目标检测回顾DETR对比Swin Transformer摘要检测网络流程DERT网络架构编码器概述解码器概述整体结构object queries的初始化Decoder中的Muiti-Head Self-AttentionDecoder中的Muiti-Head Attention 损失函数解决的问题 基于卷积神经网络的目标检…

内网穿透实战应用——【通过cpolar分享本地电脑上有趣的照片:发布piwigo网页】

通过cpolar分享本地电脑上有趣的照片:发布piwigo网页 文章目录 通过cpolar分享本地电脑上有趣的照片:发布piwigo网页前言1. 设定一条内网穿透数据隧道2. 与piwigo网站绑定3. 在创建隧道界面填写关键信息4. 隧道创建完成 总结 前言 首先在本地电脑上部署…

mysql知识点+面试总结

目录 1 mysql介绍 2 数据库常见语法 3 数据库表的常见语法 4 其他常见语法(日期,查询表字段) 5 JDBC开发步骤 6 索引 6.1 索引常见语法 7 常见面试总结 8 java代码搭建监控页面 1 mysql介绍 数据库:存储在硬盘上的文件系统…

VR虚拟展厅如何将客户引流到线下?

VR虚拟展厅是一项很不错的创新技术,将传统的展览内容以数字化形式呈现,为参观者带来全新的展示体验,也为企业带来了全新的宣传机遇。 线上虚拟展厅目前有着两种形式,一种是通过三维建模技术、虚拟现实技术等搭建的虚拟展厅&#x…

Docker 容器内无法使用vim命令 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 进入Docker容器后 无法使用vim编辑器,出现如下问题:bash: vim: command not found 如图所示: 想着通过apt-get 安装vim,出现如下问题: root@b9f0fd330d5b:/# apt-get install vim Reading package lists... Done B…

spring入门基本介绍及注入方式---详细介绍

一,spring的简介 Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 提供了许多功能强大且易于使用的特性,使得开发者能够更加轻松地构建可维护且可扩展的应用程序,简单来说: Spring使用基…

kaggle注册不显示验证码

edge浏览器 1.点击浏览器右上角三个点 2.点击扩展 3.点击管理扩展 4.点击获取Microsoft Edge扩展,在左上角输入Head Editor 5.输入https://www.azurezeng.com/static/HE-GoogleRedirect.json 6.下载后,点保存 成功!

星际争霸之小霸王之小蜜蜂(二)--类的使用

目录 前言 一、将设置内容写在一个类里 二、设置小蜜蜂的造型 三、设置猫蜜蜂的参数 四、绘制猫蜜蜂到窗口 总结 前言 昨天我们设置好了窗口,下面我们需要向窗口中添加元素了。 一、将设置内容写在一个类里 我个人理解书上的意思是要创建一个类,将所有需…

基于CentOS 7 部署社区版Haproxy

HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件,是一款具 备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支 持正则表达式及web状态统计。 目录 1…

Linux:shell脚本 正则表达式与AWK

一、正则表达式 由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件…

【LeetCode每日一题】——128.最长连续序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 中等 三【题目编号】 128.最长连续序列 四【题目描述】 给定一个未…

vue3+element-plus表格默认排序default-sort失效问题

场景 在使用动态数据渲染的场景&#xff0c;el-table设置默认属性default-sort失效。 原因 el-table的default-sort属性是针对静态数据的&#xff0c;如果是动态数据&#xff0c;default-sort则无法监听到。 案例&#xff1a;静态数据 <template><el-table:data&…

马斯克又出昏招、最疯狂的举动之一

马斯克正在限制他不喜欢的新闻网站和竞争对手的流量。在 X&#xff08;原 Twitter&#xff09;上点击纽约时报、路透社、Facebook、Instagram、Threads、Bluesky 和 Substack 的链接&#xff0c;X 故意增加 5 秒钟的开启延迟。 5 秒延迟&#xff0c;新的降权举措&#xff1f; …

联想拯救者笔记本Win11系统键盘无法打字解决参考方法

一位好机友新购买的联想拯救者笔记本在使用过程中突然发现整个键盘都不能使用了、不能打字、按任何按键都没有反应&#xff0c;只有鼠标能正常操作&#xff1b;那么这是什么问题呢&#xff1f;能不能是笔记本的键盘坏了呢&#xff1f;还是笔记本出现了什么故障而引起键盘失灵呢…