JVM的几种常见垃圾回收算法

news2024/11/23 9:37:34

引言:

        Java Virtual Machine(JVM)作为Java程序运行的核心,其垃圾回收(Garbage Collection, GC)机制在内存管理中起着至关重要的作用。垃圾回收算法是JVM性能优化的重要方面。本文将详细介绍几种常见的垃圾回收算法,包括标记-清除(Mark-and-Sweep)、复制(Copying)、标记-整理(Mark-and-Compact)、分代收集(Generational Collection)和G1(Garbage-First)等。

1. 标记-清除(Mark-and-Sweep)

标记-清除算法是最基础的垃圾回收算法之一,其主要过程分为两个阶段:标记和清除。

标记阶段

从根对象(GC Roots)开始,遍历整个对象图,标记所有可达对象。可达对象即从GC Roots出发可以直接或间接引用到的对象。

清除阶段

遍历整个堆内存,清除所有未标记的对象,将它们的内存空间回收。

 

优点

  • 实现简单,算法逻辑清晰。

缺点

  • 标记和清除过程会导致应用程序暂停(Stop-The-World),影响性能。
  • 清除阶段会产生内存碎片,导致大对象分配困难。

2. 复制(Copying)

复制算法通过将内存划分为两块相等的区域,称为“From空间”和“To空间”,每次只使用其中的一块。

回收过程

  1. 从根对象开始,标记并复制所有可达对象到To空间。
  2. 复制过程中,更新对象的引用。
  3. 复制完成后,清空From空间,交换From和To空间的角色。

 

优点

  • 每次回收后,To空间中的对象是连续分布的,不会产生内存碎片。
  • 回收效率较高,尤其适用于存活对象较少的情况。

缺点

  • 需要两块相同大小的内存区域,空间浪费较大。
  • 不适用于存活对象较多的情况。

3. 标记-整理(Mark-and-Compact)

标记-整理算法结合了标记-清除和复制算法的优点,适用于老年代的垃圾回收。

回收过程

  1. 标记阶段与标记-清除算法相同,标记所有可达对象。
  2. 整理阶段,将所有存活对象向堆的一端移动,保持内存的连续性。
  3. 移动完成后,清除后半部分的内存空间。

优点

  • 避免了内存碎片问题。
  • 内存利用率高,不需要额外的空间。

缺点

  • 对象移动过程较复杂,需要更新所有引用,回收效率相对较低。

4. 分代收集(Generational Collection)

分代收集算法基于对象的生命周期特点,将堆内存划分为年轻代(Young Generation)和老年代(Old Generation)。

年轻代

年轻代包括Eden区和两个Survivor区(From和To)。大部分对象在年轻代分配,年轻代的GC称为Minor GC。

老年代

老年代存放经过多次GC仍然存活的对象,老年代的GC称为Major GC或Full GC。

优点

  • 大多数对象在年轻代分配和回收,利用复制算法进行Minor GC,效率高。
  • 老年代采用标记-整理算法,减少内存碎片。

缺点

  • 需要根据对象的生命周期进行分代管理,算法实现较复杂。

5. G1(Garbage-First)

G1垃圾回收器是JVM的一种面向服务端应用的高性能垃圾回收器,设计目标是提供高吞吐量和低暂停时间。

工作原理

G1将堆内存划分为多个大小相等的区域(Region),每个Region可以作为年轻代或老年代的一部分。GC过程分为年轻代GC和混合GC(Mixed GC)。

回收过程

  1. 年轻代GC:类似于分代收集的Minor GC,仅回收年轻代的Region。
  2. 混合GC:回收整个堆,包括年轻代和部分老年代的Region,根据回收收益优先选择垃圾最多的Region。

优点

  • 可以控制GC的停顿时间,适合大内存的应用场景。
  • 回收效率高,能够处理堆内存碎片问题。

缺点

  • 算法实现复杂,参数调整难度较大。

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

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

相关文章

45.django - 开始建立第一个项目

1.django是什么? Django是一个高级的、免费的、开源的Web应用框架,它由Python编程语言编写而成。Django遵循模型-视图-控制器(MVC)的设计模式,但通常将其称为模型-视图-模板(MVT)架构。它的主要…

Llama模型家族之Stanford NLP ReFT源代码探索 (二)Intervention Layers层

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

CentOS安装Node.js以及JSDOM跳坑记

笔者在一台 CentOS 7.9 的服务器上使用常规的安装命令:sudo yum install node 来安装 Node.js,到最后系统提示: Error: Package: 2:nodejs-20.14.0-1nodesource.x86_64 (nodesource-nodejs) Requires: libstdc.so.6(GLIBCXX_3.4.20)(64bit) …

RabbitMQ-工作模式(Topics模式RPC模式Publisher Confirms模式)

文章目录 Topics模式topic代码示例 RPC模式客户端界面回调队列关联ID总结RPC代码示例 Publisher Confirms模式概述在通道上启用发布者确认单独发布消息批量发布消息异步处理发布者确认总结总体代码示例 更多相关内容可查看 Topics模式 在Topics中,发送的消息不能具…

C#异步编程是怎么回事

首先以一个例子开始 我说明一下这个例子。 这是一个演示异步编程的例子。 输入job [name],在一个同步的Main方法中,以一发即忘的方式调用异步方法StartJob()。输入time,调用同步方法PrintCurrentTime()输出时间。输出都带上线程ID,便于观察。 可以看到,主线程不会阻塞。主…

SmartEDA VS Multisim/Proteus:电子设计江湖,谁主沉浮?

在电子设计的江湖里,SmartEDA、Multisim和Proteus无疑是几大门派,各自拥有独特的武功秘籍和门派特色。今天,我们就来一场巅峰对决,看看这些电子设计软件究竟谁能笑傲江湖,成为电子设计界的霸主! 一、门派起…

【虚拟现实】一、AR与VR的基本原理

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 增强现实(AR)和虚拟现实(VR)技术已经从科幻小说走入现实&#xf…

atomic特质的局限性

为什么在实际的 Objective-C 开发中, 几乎所有的属性都声明为 nonatomic ? 声明为 atomic 的属性我是真的没见过 在实际的 Objective-C 开发中,大多数属性通常声明为 nonatomic,主要原因包括性能考虑和常见的设计模式。具体原因如下: 性能问…

Leetcode刷题笔记8

162. 寻找峰值 162. 寻找峰值 - 力扣(LeetCode) 对于所有有效的 i 都有 nums[i] ! nums[i 1] 解法一:暴力解法 从第一个位置一直向后走,然后分情况即可1. 第二个元素就往下降,那么第一个元素就是峰顶 2. 一直遍历…

Linux -- 正则表达式基础

提示:制作不易,可以点个关注和收藏哦。 前言 虽然我们这一节的标题是正则表达式,但实际这一节实验只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包…

【C++】函数模板和类模版

目录 前言 模板参数 类型模板参数 非类型模板参数 模板的特化 函数模板的特化 类模板的特化 全特化 偏特化 模板的分离编译 模板总结 前言 函数模板和类模板是C模板编程中的两个核心概念,它们允许程序员编写泛型代码,这些代码可以在多种数据…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

对称加密系统解析

目录​​​​​​​ 1.概述 2. 对称密码类型 3. 对称加密优缺点 4. 对称加密算法 4.1 DES 4.2 3DES 4.3 AES ​​​​​​4.4 SM1 4.5 SM4 1.概述 对称加密,是指在加密和解密时使用同一秘钥的方式。秘钥的传送和保存的保护非常重要,务必不要让秘…

【React】json-server

1.安装到开发环境 npm install json-server -D2.在根目录下下,新建db.json文件 {"list": [{"rpid": 3,"user": {"uid": "13258165","avatar": "http://toutiao.itheima.net/resources/images/9…

显示子系统,显示子前后端,linuxfb,wayland

显示前端 显示前端通常指的是在图形系统中负责生成图形数据的部分或组件。它负责接收来自应用程序或图形引擎的图形数据,并将其转换成适合显示的格式,以便发送到显示后端进行处理和输出。 显示前端的功能通常包括以下几个方面: 图形数据生…

自定义类型:枚举(enum)+联合体(union)

枚举联合体 一.枚举1.枚举类型的声明2.枚举类型的优点3.枚举类型的使用 二.联合体1.联合体类型的声明2.联合体的特点3.相同成员的结构体和联合体对比4.联合体大小的计算5.联合体的练习(判断大小端)6.联合体节省空间例题 一.枚举 1.枚举类型的声明 枚举…

《软件定义安全》之四:什么是软件定义安全

第4章 什么是软件定义安全 1.软件定义安全的含义 1.1 软件定义安全的提出 虚拟化、云计算、软件定义架构的出现,对安全体系提出了新的挑战。如果要跟上网络演进的步伐和业务快速创新的速度,安全体系应该朝以下方向演变。 𝟭 安全机制软件…

springcloud gateway扩展支持多版本灰度

改造要求 需要在原有的调度策略中通过客户端header中的version进行1个服务多实例下进行二次分组,让指定的version在指定的版本实例下进行轮训调度。 需要改造的点 1.业务服务在发布到naocs中的元数据需要指定版本号 2.网关的调度策略中需要增加版本的区分 3.无…

LeetCode | 1.两数之和

这道题,很容易想到的是暴力解,直接一个双重循环,对于数组中的每一个数,都去遍历其他数字,看能不能找到数字等于target-nums[i]的数字,时间复杂度为 O ( n 2 ) O(n^2) O(n2) 但是通过其他题目,我…

【算法专题--链表】环形链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、什么是环形链表? 🥝 环形链表的概念详解 🍇 环形链表的特点 🍍环形链表的延申问题 三、高频面试题 ✨环形链表 ✨环形链表II ✨环形链表的环长 四、总结 五、共勉 一、前言 环形链表,可以说是…