当前位置: 首页 > news >正文

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

引言:

        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的停顿时间,适合大内存的应用场景。
  • 回收效率高,能够处理堆内存碎片问题。

缺点

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flutter笔记:关于WebView插件的用法(上)
  • Linux基础IO【II】真的很详细
  • 什么是CSS的:target选择器
  • css实现优惠券样式
  • 破布叶(Microcos paniculata)单倍型染色体级别基因组-文献精读22
  • 软考初级网络管理员_08_网络单选题
  • Docker:镜像命令和容器命令
  • FPGA+金融|硬件行情加速系统 打造极速交易场景
  • Stability AI发布新版文生图模型:依然开源
  • C++面向对象程序设计 - 输入输出流进一步研究
  • 2024.6.13 刷题总结
  • 编程器可以做什么游戏:探索游戏开发的无限可能
  • 第十六篇——置信度:马斯克犯了什么数学错误?
  • 新研究使VQE算法成功扩展到12个量子比特,误差抑制在两个数量级
  • ArcGIS中几个好用的空间分析工具
  • [译] 怎样写一个基础的编译器
  • 【5+】跨webview多页面 触发事件(二)
  • Akka系列(七):Actor持久化之Akka persistence
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • js ES6 求数组的交集,并集,还有差集
  • React-flux杂记
  • WePY 在小程序性能调优上做出的探究
  • 包装类对象
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于字符编码你应该知道的事情
  • 盘点那些不知名却常用的 Git 操作
  • 使用 @font-face
  • 微信公众号开发小记——5.python微信红包
  • 用Python写一份独特的元宵节祝福
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • Mac 上flink的安装与启动
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (十八)三元表达式和列表解析
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)http协议
  • .NET BackgroundWorker
  • .NET IoC 容器(三)Autofac
  • .net后端程序发布到nignx上,通过nginx访问
  • @DataRedisTest测试redis从未如此丝滑
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [《百万宝贝》观后]To be or not to be?
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [AR]Vumark(下一代条形码)
  • [asp.net core]project.json(2)
  • [ASP]青辰网络考试管理系统NES X3.5
  • [C++][数据结构][跳表]详细讲解
  • [Codeforces] number theory (R1600) Part.11
  • [cvpr 2024 目标检测 前沿研究 热点] cpvr 2024中与目标检测主题有关的论文
  • [DevEpxress]GridControl 显示Gif动画