news 2026/5/13 22:32:11

JVM垃圾回收算法及适用场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM垃圾回收算法及适用场景

一、什么是JVM垃圾回收?

我们写Java程序时,会创建很多对象(比如new一个对象),这些对象会占用JVM的内存。当这些对象不再被使用(比如用不到的变量、结束的方法),就变成了“内存垃圾”,如果不及时清理,内存会被占满,程序就会卡顿、崩溃。

JVM的垃圾回收(GC),就是自动识别并清理这些“内存垃圾”的过程,而垃圾回收算法,就是JVM清理垃圾时采用的“具体方法”。

类比:就像我们的房间,每天都会产生垃圾(废纸、空瓶子),如果不清理,房间会越来越乱,最后连落脚的地方都没有;垃圾回收算法,就是我们清理房间的不同方式——有的直接扔,有的分类整理后再扔,有的先归置再清理,每种方式各有优劣。

二、4种核心垃圾回收算法

JVM有4种最核心的垃圾回收算法,没有“最好”的算法,只有“最适合”的场景。

1. 标记-清除算法(最基础、最原始)

核心逻辑:分两步走,先“标记”垃圾,再“清除”垃圾。第一步,JVM遍历所有对象,给“还在使用的对象”做个标记;第二步,遍历整个内存,把没有标记的对象(垃圾)全部清理掉,释放内存空间。

类比:整理房间时,先逐个查看物品,给“还要用的东西”贴个标签(标记),然后把没有贴标签的东西(垃圾)全部扔到垃圾桶(清除),流程简单直接。

优点:实现简单,不用复杂的操作,清理逻辑直观,而且不需要预留额外的内存空间,能充分利用现有内存。

缺点:有两个明显问题——一是清理后会产生很多“内存碎片”(就像房间清理后,剩下的东西零散摆放,没有连续的空间),后续要放“大对象”(比如占用内存多的对象)时,可能因为没有连续的内存空间,即使总内存足够,也无法存放;二是清理效率不高,标记和清除两个阶段都要遍历整个内存,内存越大,耗时越长,会导致程序短暂卡顿。

适用场景:因为缺点比较明显,现在JVM已经很少单独使用这种算法了,主要作为其他复杂算法的“基础”,比如老年代垃圾回收的辅助步骤,或者对内存利用率要求高、但对卡顿不敏感的简单场景。

2. 复制算法(无碎片、效率高)

核心逻辑:把JVM的内存分成两块(大小相等),每次只使用其中一块。当正在使用的这块内存满了,就先标记出里面“还在使用的对象”,然后把这些存活的对象,全部复制到另一块空闲的内存中,最后把原来那块内存的垃圾全部清空,循环往复。

类比:把房间分成两个区域,平时只在A区域放东西,A区域满了,就把A区域里还要用的东西,全部搬到B区域,然后把A区域的垃圾全部清空,下次就用B区域,用完再搬回A区域,这样房间里的东西永远是整齐的,没有零散的垃圾。

优点:没有内存碎片,存活对象被连续放置,后续分配大对象时很方便;清理效率高,不用遍历整个内存清理垃圾,只需清空用过的那块内存即可,能减少程序卡顿。

缺点:内存利用率低,因为要预留一半的内存作为“备用空间”,相当于一半的内存一直空闲,浪费资源;如果存活的对象很多(比如大部分对象都还在使用),复制这些对象会消耗大量资源,效率会大幅下降。

适用场景:最适合“对象存活时间短、垃圾多”的场景,比如JVM的“新生代”。新生代是存放新创建对象的地方,这些对象大多是“朝生夕死”的(比如方法里的局部变量,方法执行完就没用了),存活对象少,复制起来开销小,刚好适配复制算法的特点,现在JVM的新生代垃圾回收,基本都用这种算法的优化版。

3. 标记-整理算法(平衡碎片与效率)

核心逻辑:结合了“标记-清除”和“复制”两种算法的优点,分三步走。第一步,和标记-清除算法一样,标记出所有还在使用的对象;第二步,把所有存活的对象,全部移动到内存的一端,整齐排列;第三步,清理掉内存另一端的所有垃圾,释放出连续的内存空间。

类比:整理房间时,先给还要用的东西贴标签(标记),然后把所有贴了标签的东西,全部搬到房间的一端,整齐摆好(整理),最后把房间另一端的垃圾全部清理掉,这样既清理了垃圾,又保证了剩余空间是连续的,没有碎片。

优点:没有内存碎片,能满足大对象的分配需求;内存利用率高,不用预留备用空间,能充分利用所有内存;适合存活对象多的场景,比复制算法更节省资源。

缺点:执行效率中等,比复制算法慢(多了“整理”的步骤),移动存活对象时,还要更新对象的引用地址,操作更复杂,会导致程序短暂卡顿,而且卡顿时间比标记-清除算法更长。

适用场景:适合“对象存活时间长、存活对象多”的场景,比如JVM的“老年代”。老年代存放的是经过多次垃圾回收后,依然存活的对象,这些对象存活时间长、数量多,用标记-整理算法,既能避免内存碎片,又能提高内存利用率,是老年代垃圾回收的核心算法。

4. 分代收集算法(最常用、最实用)

核心逻辑:这不是一种独立的算法,而是结合前面三种算法的“复合策略”。它的核心思路是:根据对象的存活时间,把JVM的内存分成“新生代”和“老年代”两个区域,不同区域采用不同的垃圾回收算法,扬长避短。

具体逻辑:

  • 新生代:存放新创建的对象,存活时间短、垃圾多,采用“复制算法”,清理效率高、无碎片;

  • 老年代:存放存活时间长的对象,存活对象多、垃圾少,采用“标记-整理”或“标记-清除”算法,平衡内存利用率和碎片问题。

类比:把房间分成“常用区”(新生代)和“储藏区”(老年代),常用区放经常用、容易更换的东西(比如纸巾、笔),用复制算法快速清理;储藏区放长期不用、需要保留的东西(比如换季衣服、行李箱),用标记-整理算法整理,既高效又不浪费空间。

优点:综合了前面三种算法的优点,兼顾了清理效率、内存利用率和无碎片的需求,是最贴合实际应用场景的算法。

缺点:实现逻辑比单一算法复杂,需要管理两个不同的内存区域,还要处理对象在两个区域之间的“转移”(比如新生代的对象存活时间长了,会转移到老年代)。

适用场景:现代JVM的默认垃圾回收策略,几乎所有Java程序(比如SpringBoot项目、普通Java应用)都在使用。我们平时写的程序,不用手动选择算法,JVM会自动用分代收集算法,根据对象的存活情况,自动切换不同的清理方式。

三、算法对比&避坑总结

1. 四种算法核心对比(简单好记)

算法名称

核心特点

适用场景

标记-清除

简单、有碎片、效率低

作为其他算法基础,简单场景

复制算法

无碎片、效率高、内存利用率低

JVM新生代(对象存活时间短)

标记-整理

无碎片、内存利用率高、效率中等

JVM老年代(对象存活时间长)

分代收集

综合优势、逻辑复杂

所有Java程序(JVM默认)

2. 避坑要点

  • 避坑1:没有“最优”的算法,只有“最适合”的场景——比如复制算法适合新生代,标记-整理适合老年代,分代收集算法就是结合两者的优势,适配实际应用;

  • 避坑2:不用深入研究算法的底层实现,比如不用纠结“标记怎么实现”“对象怎么复制”,只要懂核心逻辑和适用场景,就能理解JVM的垃圾回收机制;

  • 避坑3:平时写程序,不用手动选择垃圾回收算法——JVM会自动采用分代收集算法,我们只需要关注“内存是否溢出”“程序是否卡顿”,后续针对性调优即可;

  • 避坑4:不要混淆“垃圾回收算法”和“垃圾回收器”——算法是“清理垃圾的方法”,回收器是“实现算法的工具”,比如G1回收器,就是基于分代收集算法实现的。

最终总结

1. JVM垃圾回收算法,本质是“清理内存垃圾的不同方法”,核心有4种:标记-清除、复制、标记-整理、分代收集;

2. 每种算法各有优劣,适配不同场景:新生代用复制算法,老年代用标记-整理算法,日常应用用分代收集算法;

3. 学习这部分知识,重点是理解“每种算法适合什么场景”,不用死记硬背复杂流程,结合类比,很容易就能掌握。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 22:30:36

Acode Android代码编辑器构建:从源码到APK的完整实战指南

Acode Android代码编辑器构建:从源码到APK的完整实战指南 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode Acode是一款功能强大的Android平台代码编辑器,支持多种编程…

作者头像 李华
网站建设 2026/5/13 22:26:36

冰雪传奇点卡版安装与进阶攻略(全干货,新手必看)

老玩家都懂,玩传奇类游戏,正版安装是基础,进阶技巧是关键!冰雪传奇点卡版是正规合规作品,出版号可查,今天就给大家详细拆解安装步骤和进阶攻略,不管是新手还是回归玩家,看完都能少走…

作者头像 李华
网站建设 2026/5/13 22:25:29

Cangaroo终极指南:开源CAN总线分析软件完整安装与使用教程

Cangaroo终极指南:开源CAN总线分析软件完整安装与使用教程 【免费下载链接】cangaroo Open source can bus analyzer software - with support for CANable / CANable2, CANFD, and other new features 项目地址: https://gitcode.com/gh_mirrors/ca/cangaroo …

作者头像 李华
网站建设 2026/5/13 22:23:11

改进A*路径规划与动态避障决策【附程序】

✨ 长期致力于路径规划、算法改进、搜索节点、动态避障、ROS移动机器人、局部路径、全局路径研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)动态加权…

作者头像 李华
网站建设 2026/5/13 22:20:36

从论文复现到算法创新:我是如何利用VRP标准算例搞定实验对比的

从论文复现到算法创新:VRP标准算例的实战应用指南 在算法研究领域,车辆路径问题(VRP)一直是组合优化中的经典难题。每当我翻开顶级期刊论文,总会被那些漂亮的实验结果所吸引——精确到小数点后三位的优化率、清晰的收敛曲线、严谨的统计检验。…

作者头像 李华