JVM 之 垃圾收集算法详解

news2024/10/3 4:34:28

文章目录

  • 一、标记清楚算法
  • 二、标记复制算法
  • 三、标记整理算法
  • 四、不同垃圾收集算法优缺点总结
    • 1. 标记-清除算法:
    • 2. 标记-复制算法:
    • 3. 标记-整理算法:

一、标记清楚算法

标记清除是一种简单而直接的垃圾回收算法。它的执行流程如下:当JVM标记出内存中的垃圾对象后,直接将其清除。然而,这种算法存在一个明显的缺点,即会导致内存空间的不连续,从而产生大量的内存碎片。

下图展示了标记清除算法执行后的内存空间示意图:

标记清楚算法

这里我们使用左侧的图来表示垃圾回收之前的内存状况,其中黄色区域表示可以被回收的垃圾对象。

这些对象在内存空间中不是连续的。

右侧的图表示垃圾回收后的内存情况,可以清楚地看到其中存在着断断续续的内存碎片。

然而,尽管垃圾已经被回收,但内存碎片仍然存在。你可能会问,那又有什么关系呢?毕竟内存碎片就是内存碎片嘛。

这里假设这些内存碎片所占用的总空间为1M,现在我们需要创建一个大小为1M的新对象。然而,不幸的是,尽管内存空间的总大小为1M,但并不是连续的。因此,我们无法将这个大对象存放在内存中。换句话说,这种情况必然导致内存空间的浪费,这就是内存碎片的危害。

如下图所示:
标记清楚算法

🎉优点:🎉

  • 高效:垃圾回收不需要移动和复制对象。

🎉缺点:🎉

  • 内存碎片:垃圾回收过程会导致内存碎片的产生,从而造成内存的浪费。

二、标记复制算法

由于标记清楚算法会产生大量的内存空间碎片问题,所以产生了标记复制算法:

复制算法是一种改进的垃圾回收算法,其工作原理如下:

首先将内存划分为两个区域。

新创建的对象都放在其中一块内存区域上。当该区域快要满的时候,就将被标记为存活的对象复制到另一块内存区域中(注意,这些对象在复制时在内存空间上是严格排序且连续的),这样就腾出了一半内存区域,使其变成了空闲空间。

然后,将所有的引用指向新的内存区域,并且清除原来的内存区域。这个过程不断循环运行。

复制算法
在回收之前,将被标记为存活的对象复制到另一块内存区域。然后,回收垃圾对象,使其变成空闲空间,最终会变成下图:
复制算法
如果再有新对象被创建,它将会被放置在右边的内存区域。当右边的内存区域满了之后,存活的对象会被复制到左边的内存区域,然后清除掉垃圾对象。

标记-复制算法的明显缺点是浪费了一半的内存空间,但优点是不会产生内存碎片。因此,在技术发展中常常会面临一个矛盾的抉择,即引入新技术必然会带来新问题。

到这里,我们来简单总结一下标记-复制算法的优缺点:

🎉优点:🎉

  • 内存空间是连续的,不会产生内存碎片

🎉缺点:🎉

  • 浪费了一半的内存空间
  • 复制对象会导致性能和时间的消耗。

三、标记整理算法

标记-整理算法是综合了标记-清除算法和标记-复制算法的特点,并进行了演化而来的。

它的执行流程可以分为两个阶段:🎃标记阶段和整理阶段🎃

标记阶段: 与标记-清除算法相同,首先遍历GC Roots,并标记所有存活的对象。

整理阶段: 移动所有存活的对象,按照内存地址的次序依次排列,然后回收末端内存地址以后的内存空间。因此,第二阶段被称为整理阶段。

下面这张图是垃圾回收前的示意图:
标记整理
下图表示的是标记-整理算法的第一阶段:标记并清除垃圾对象,同时标记出存活对象

标记整理算法
接下来,来到第二阶段,整理碎片:
标记整理算法
可以看到,通过标记-整理算法,我们既解决了内存碎片的问题,又充分利用了内存空间,避免了浪费。

然而,标记-整理算法在执行标记和整理的过程中会消耗大量的时间,尤其是在高并发的场景下,这可能会导致性能低下。

综上所述,标记-整理算法的优点是不会产生内存碎片和浪费内存空间,但缺点是执行时间较长,性能较低。

四、不同垃圾收集算法优缺点总结

1. 标记-清除算法:

优点:

  • 不会产生内存碎片。
  • 可以在有限的空间中进行垃圾回收。

缺点:

  • 执行效率相对较低,因为需要遍历整个堆来标记和清除垃圾对象。
  • 可能会导致内存碎片问题,因为垃圾对象所占用的空间无法被重用。

2. 标记-复制算法:

优点:

  • 不会产生内存碎片。
  • 执行效率相对较高,因为只需要遍历存活对象进行复制。

缺点:

  • 浪费了一半的内存空间,因为需要将存活对象复制到另一半空闲的内存区域。
  • 当存活对象较多时,复制的开销会增加。

3. 标记-整理算法:

优点:

  • 不会产生内存碎片。
  • 可以充分利用内存空间,避免浪费。
  • 相对于标记-清除算法,整理过程可以提高内存分配的效率。

缺点:

  • 执行效率较低,因为需要进行标记和整理的过程。
  • 当存活对象较多时,整理的开销会增加。

🎈从时间长短的角度来看🎈 :标记-清除算法的执行时间较短,优于标记-复制算法,而标记-整理算法的执行时间最长。

🎈从结果来看🎈:标记-整理算法的效果稍逊于标记-复制算法,但优于标记-清除算法。

综合而言,可以得出以下结论:✨,不同的垃圾回收算法有各自的优缺点,选择合适的算法需要根据具体的场景和需求来决定。

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

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

相关文章

【Rust】Rust学习 第十九章高级特征

现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们&#xf…

SpringBoot案例-文件上传

目录 简介 文件上传前端页面三要素 服务端接收文件 小结 本地储存 实现 代码优化 小结 阿里云OSS 阿里云 阿里云OSS 使用第三方服务--通用思路 准备工作 参照官方SDK代码,编写入门程序 集成使用 阿里云OSS-使用步骤 阿里云OSS使用步骤 参照SDK编写入…

【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】

【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】 1、前言2、实验环境3-1、学习链接-参考文章3-2、先前了解-自我总结(1)线程处理逻辑事件,不能带有主窗口的事件(2&…

攻防世界-base÷4

原题 解题思路 base644,莫不是base16,base16解码网站: 千千秀字

k8s 安装istio (一)

前置条件 已经完成 K8S安装过程十:Kubernetes CNI插件与CoreDNS服务部署 部署 istio 服务网格与 Ingress 服务用到了 helm 与 kubectl 这两个命令行工具,这个命令行工具依赖 ~/.kube/config 这个配置文件,目前只在 kubernetes master 节点中…

postgres数据常用SQL语句

-- 系统信息函数 select version(),user,current_user; -- 创建表 CREATE TABLE biao(id INT primary key,name VARCHAR(25) not null,sex VARCHAR(25) unique,salary FLOAT default 9000 ); -- 更换表名 ALTER TABLE biaoRename to biao1; -- 更换字段类型 ALTER TABLE biao1 …

Tushare入门小册

Tushare入门小册 一、Tushare平台介绍 Pro版数据更稳定质量更好了,我们提供的不再是直接从互联网抓取,而是通过社区的采集和整理存入数据库经过质量控制后再提供给用户。但Pro依然是个开放的,免费的平台,不带任何商业性质和目的…

红黑树的调整图解

讲的很好 的红黑树原理 上面的视频讲解的红黑树很好。尤其是关于红黑树的调整。画图做了下总结,谢谢。

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…

微服务中间件--统一网关Gateway

统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在Spr…

基于大数据+django+mysql的银行信用卡用户的数仓系统

系统阐述的是银行信用卡用户的数仓系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构…

国民新旅游时代拉开大幕,OTA平台迎来新红利和新任务

高温轮番而至&#xff0c;这个燥热的夏天&#xff0c;旅游业也躁动不已。 上半年是旅游业丰收的半年&#xff0c;各地旅游盛况频上热搜。文旅部公布的旅游数据显示&#xff0c;2023年上半年&#xff0c;国内旅游总人次23.84亿&#xff0c;同比增长63.9%&#xff1b;国内旅游收…

IO day 7

1、使用消息队列完成两个进程间相互通信 msgsnd #include <myhead.h>typedef struct {long msgtype;char data[1024]; }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long)int main(int argc, const char *argv[]) {//创建key值key_t key;if((key ftok("/",k…

Feign:使用接口方式调用服务

创建一个新的消费者模块并导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…

创建k8s operator

目录 1.前提条件 2.进一步准备 2.1.安装golang 2.2.安装code&#xff08;vscode的linux版本&#xff09; 2.3.安装kubebuilder 3.开始创建Operator 3.1.什么是operator? 3.2.GV & GVK & GVR 3.3.创建operator 3.3.1. 生成工程框架 3.3.2.生成api(GVK) …

C++设计模式之适配器模式

一、适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成另一个类所期望的接口&#xff0c;以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题&#xff0c;使得原本因接口不…

JavaScript下载excel文件

文章目录 通过链接下载a标签下载方法注意 获取文件流请求体配置下载文件流 总结 通过链接下载 a标签 对于已知地址的目标文件&#xff0c;前端可以使用 a标签 来直接下载&#xff0c;使用a标签下载使用到两个属性 download&#xff1a;下载文件名href&#xff1a;目标文件下…

ORA-01174: DB_FILES be compatible RAC rolling fashion complete outage

How to change the DB_FILES parameter in RAC (Doc ID 1636681.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 10.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…

【业务功能篇75】微服务项目环境搭建docker-mysql-redisSpringCloudAlibaba

项目环境准备 1.虚拟机环境 我们可以通过VMWare来安装&#xff0c;但是通过VMWare安装大家经常会碰到网络ip连接问题&#xff0c;为了减少额外的环境因素影响&#xff0c;Docker内容的讲解我们会通过VirtualBox结合Vagrant来安装虚拟机。 VirtualBox官网&#xff1a;https:/…

《热题101》链表篇

思路&#xff1a;之前有反转链表前n个值、以及反转指定区间的链表&#xff0c;所以这个我只想在这两个基础上实现。用左右指针来确定当前反转的区间&#xff0c;每次反转之前都检查一下当前区间是否足够k&#xff0c;即区间之后的节点cur&#xff0c;足够就可以反转&#xff0c…