了解垃圾回收算法

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

垃圾回收(Garbage Collect)是Java语言中的一种自动内存管理机制,用于自动回收不再使用的对象所占用的内存空间。Java虚拟机会自动追踪和识别不再使用的对象,并将其回收,以释放内存资源。垃圾回收的主要目的是自动管理内存,以避免内存泄漏和内存溢出等问题。

1

 Java中的垃圾回收机制

0e354f2d29c307871babfee7b44a6ba3.png

Java中的垃圾回收机制通过以下步骤进行:

标记(Mark):标记所有被引用的对象,标记结束后,未被标记的对象将被视为垃圾。

清扫(Sweep):回收垃圾对象,将垃圾对象从内存中清除。

整理(Compact):移动活对象,将活对象从原地移到新的位置,以便后续的存储。

再次标记(Mark):经过移动后,重新标记所有活对象,确保它们的引用关系正确。

再次清扫(Sweep):再次清理未被标记的对象。

Java中的垃圾回收器是并发执行的工作线程,它们在后台运行,并自动触发。

通过标记过程来确定一个对象是垃圾标记所有被引用的对象,标记结束后,未被标记的对象将被视为垃圾。只要在标记阶段被标记的对象,在后续的程序执行过程中就不会被修改,那么它们就是垃圾,等待回收。标记主要有 2 种方法。

1、引用计数法

在对象中设置一个引用计数器,每当有一个地方引用它时,计数器值就加 1,引用失效时就减 1。对于一个对象而言,任何时刻计数器为 0 的对象就是不可能再被使用的,就说明该对象是垃圾。如果两个对象相互持有引用,也就是两个对象的计数器都不为 0 ,就无法通知GC收集器回收它们,这两个对象就永远不能被回收。因此在 JVM 中一般不会用它来判断对象是否存活。

2、可达性分析

通过一些 GC Roots 对象(类加载器、虚拟机栈的本地变量表、static 成员、常量引用、本地方法栈的变量、Thread等)开始向下搜索,当没有被 GC Roots 引用到的对象就可以进行回收,下图的 Object4 和  Object5 没有被GC Roots 引用,因此就可判断为可回收对象。

0208ff234feb80b31fcc47c242e2bb80.png

2

垃圾收集算法

6fdd4a25c07a23bacb43c808f6a35fd0.png

垃圾收集算法主要有 4 种。

1、复制算法(Copying)

将内存划分为两块相等的区域,每次只使用其中一块,当进行 GC 的时候,就将还存活的对象复制到另外一块上面,然后把已经使用过的内存空间一次性清空。比如 S0 和 S1。

2、标记-清理算法(Mark-Sweep)

标记:当进行 GC时,所有的对象都会被扫描一遍,找出内存中需要回收的对象,并且把它们标记出来,从而确定需要垃圾回收的对象。标记的过程就是利用可达性分析找到垃圾对象

清理:在标记完成之后统一清理掉被标记需要回收的对象,回收所有标记过的对象,释放出对应的内存空间。

标记清理算法的缺点:标记清理过程比较耗时,标记清理之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

3、标记-整理算法(Mark-Compact)

标记过程仍然与"标记-清理"算法一样,但是后续步骤不是直接对可回收对象进行清理,而是空间进行整理,整理的过程是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。

4、分层算法

将内存分为多个层次,每个层次都有不同的存活对象比例,越上面的层次,存活对象比例越高。

3

堆中的垃圾收集算法使用

b4ebe3fafdebb37d14bfd078f70f57e4.png

在堆内存中主要是利用分代来使用不同的垃圾收集算法的,在 Young 区使用复制算法,因为绝大多数的对象在被分配之后生命周期比较短,在Young 区使用复制效率比较高。在 Old 区使用标记清除或者标记整理算法,因为 Old 区对象的生命周期比较长,对象存活时间比较长复制就没有意义了,标记以后再清理或者整理效果高。

后面将为大家介绍垃圾收集器。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# Microsoft消息队列服务器的使用 MSMQ

先安装消息队列服务器 private static readonly string path ".\\Private$\\myQueue";private void Create(){if (!MessageQueue.Exists(path)){MessageQueue.Create(path);}}private void Send(){Stopwatch stopwatch new Stopwatch();stopwatch.Start();Message…

【爬虫逆向案例】某易云音乐(评论)js逆向—— params、encSecKey解密

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 【爬虫逆向案例】某易云音乐(评论)js逆向—— params、encSecKey解密 1、前言2、行动…

国标GB28181安防视频平台EasyGBS大批量通道接入后,创建角色接口未响应的排查

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台,支持多路设备同时接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…

Python 一篇入门

目录 Python 的简介与特点 Python支持多种编程风格 解释运行 跨平台 可扩展强 可嵌入 丰富的库 Python版本选择 Python开发环境搭建 认识Python解释器 快速入门 变量和赋值 动态类型 变量命名规则 认识 "数字" 认识 "字符串" 认识 "…

TSINGSEE青犀视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作

TSINGSEE青犀视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、Web…

mysql 、sql server 常见的区别

NULL   处理 MySQL IFNULL(col , val) SQL Server ISNULL(col,val) 表名、列名等 一般不推荐用保留字 ,如果非要保留字 MySQL 用用着重号,即 反引号 包括 select col from GROUP SQL Server 用用着重号…

【GO】go语言入门实战 —— 命令行在线词典

文章目录 程序介绍抓包代码生成生成request body解析respond body完整代码 字节青训营基础班学习记录。 程序介绍 在运行程序的时候以命令行的形式输入要查询的单词,然后程序返回单词的音标、释义等信息。 示例如下: 抓包 我们选择与网站https://fany…

Docker Compose 使用方法

目录 前言 安装 Docker Compose Ubuntu 安装与更新 Red Hat 安装与更新 验证是否安装 Docker Compose 创建 docker-compose.yml 文件 创建一个MySQL 与 tomcat 示例 使用Docker Compose启动服务 前言 Docker Compose 是一个工具,旨在帮助定义和 共享多容器…

Vue如何做一个左边栏

要求一-------点击之后能够实现页面跳转,使用router,点击之后跳到指定页面: 第二步:如何实现简易的前端路由 第三步 左侧边栏的正确写法,ul中li套router-link 第四步 实现嵌套路由 第五步 ul中嵌套着li 第六步嵌套路由 第七步&…

Navidrome - 开源音乐服务器【打造属于自己的音乐播放器】「端口映射」随时随地想听就听

转载自cpolar极点云文章:Navidrome - 开源音乐服务器【打造属于自己的音乐播放器】「端口映射」随时随地想听就听 1. 前言 不知从何时开始,我们能用的音乐软件越来越少,笔者使用小米手机很久了,自从小米手机的自带音乐播放器变成…

MIAOYUN获评“2023年度一云多芯稳定安全运行优秀案例”

2023年7月25日至26日,由中国信息通信研究院(简称“中国信通院”)、中国通信标准化协会主办的以“云领创新,算启新篇”为主题的“2023可信云大会”在北京成功举办。会上公布了多项前瞻领域的评估结果和2023年度最佳实践案例&#x…

浅析视频技术与AI智能感知与生鲜供应链的数字化应用

一、行业背景 近年来,我国肉类、水果、蔬菜、水产品、乳品、速冻食品等生鲜市场需求快速增长,营商环境持续改善,推动冷链物流较快发展,但仍面临不少突出瓶颈和痛点难点卡点问题,难以有效满足市场需求。传统生鲜食材供…

公司植物日常护养方法备忘录

植物为我们净化空气,美化环境,我们要按照科学的经验照顾好它们。公司植物日常通用护养方法如下: 首先剪掉已经枯黄的部分。 需要晒太阳的植物按时搬到外面晒太阳,每次晒1到2个小时。 所有植物统一在每个月的20号左右施肥一次&am…

docker logs 使用说明

docker logs 可以查看某个容器内的日志情况。 前置参数说明 c_name容器名称 / 容器ID logs 获取容器的日志 , 命令如下: docker logs [options] c_name option参数: -n 查看最近多少条记录:docker logs -n 5 c_name--tail与-n 一样 &#…

如何编写一个易于维护的考试系统源码

编写一个易于维护的考试系统源码对于开发人员来说非常重要。一个易于维护的系统可以使代码更易于理解、修改和扩展,从而提高开发效率和系统稳定性。 第一步:良好的项目结构 良好的项目结构是一个易于维护的源码的基础。可以按照模块、功能或层次等方式…

C++初阶 - 6.模板初阶

目录 1.泛型编程 2.函数模板 2.1函数模板的概念 2.2函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 1.泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left…

LeetCode 626. 换座位

题目链接:LeetCode 626. 换座位 题目描述 表名:Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例1: 题目分析 如…

java后端富文本转word,再传递到浏览器下载。

思路参考,以及所有的工具类都使用了》牧羊人大佬的代码《 有帮助的话不用给到我点赞,给大佬点赞即可 这是前端代码,必须使用get。 post后端返回的流浏览器接收不到(具体原因不详)。get无法传递requestBody,…

Json文件编辑功能

1 Json格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。…

Java-多态

目录 1.多态的概念 2.多态的实现条件。 3.重写 4.向上转型和向下转型 5.多态的优缺点 6.避免在构造方法中调用重写方法 1.多态的概念 多态字面意思就是多种形态,具体点就是完成某个行为时,不同的对象完成时产生不同的状态。 总之,同一件…
最新文章