news 2026/4/7 15:40:35

JVM垃圾回收那些事

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM垃圾回收那些事

垃圾回收那些事)

    • 垃圾回收的算法
      • 标记清除算法
        • 流程
        • 优点:实现简单
        • 缺点:
      • 标记复制算法
        • 流程
        • 优点
        • 缺点
      • 标记整理算法(标记压缩算法)
        • 优点
        • 缺点
      • 分代GC算法
        • 内存划分
        • 为什么要分为 Young 区和老年代

垃圾回收的算法

常见的是下面这四种

  1. 标记清除算法
  2. 复制算法
  3. 标记整理算法
  4. 分代GC算法

分别介绍一下

标记清除算法

流程

首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象 。

优点:实现简单
缺点:
  1. 第一个是执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过 程的执行效率都随对象数量增长而降低;
  2. 第二个是内存空间的碎片化问题,标记、清除之后会产生大 量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找 到足够的连续内存而不得不提前触发另一次垃圾收集动作。
  3. 分配速度慢

标记复制算法

流程

它将可用 内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着 的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

优点
  1. 吞吐量高,只需要遍历一次存货对象复制到另一块内存上即可
  2. 不会发生碎片化
缺点

将可用内存缩小为了原来的一半

标记整理算法(标记压缩算法)

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

优点
  1. 内存使用率高
  2. 不会碎片化
缺点

效率不高
如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新 所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用 程序才能进行[1],这就更加让使用者不得不小心翼翼地权衡其弊端了
还有一种“和稀泥式”解决方案可以不在内存分配和访问上增加太大额外负担,做法是让虚 拟机平时多数时间都采用标记-清除算法,暂时容忍内存碎片的存在,直到内存空间的碎片化程度已经 大到影响对象分配时,再采用标记-整理算法收集一次,以获得规整的内存空间。

分代GC算法

内存划分
  1. 年轻代 Young 区(Eden 区 ,SO(form),S1(to)[ 幸存者区 ]) 复制清理算法
  2. 老年区

新产生的对象会被放在 eden 区和 from 区,每一次进行 minor GC 时,如果存活的对象会被移动到 to 区,to 区也会变成 from 区。存活的对象年龄+1,当年龄达到阈值时,会晋升到老年区。但是如果 Young 区满了,经历了一次 minorGC 后内存依然不够,会把年轻代的对象迁移到老年区中。如果老年区和 Young 区都满了,会触发一次 full GC 对整个堆内存进行一次垃圾回收

publicstaticvoidmain(String[]args)throwsIOException{List<Object>list=newArrayList<>();intcount=0;while(true){System.in.read();System.out.println(++count);list.add(newbyte[1024*1024]);}}
为什么要分为 Young 区和老年代

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

【mm_struct 与 vm_area_struct 关系详解】

好的&#xff0c;这两个是 Linux 内核内存管理中最核心的数据结构。它们共同描述了进程的虚拟地址空间。 简单来说&#xff0c;它们的关系是 “总经理”和“部门经理” 的关系&#xff1a; mm_struct&#xff1a;像一个公司的 “总经理”&#xff0c;它掌管着整个进程的虚拟内存…

作者头像 李华
网站建设 2026/4/1 23:35:09

鸣潮120帧解锁新攻略:从困惑到流畅的完整指南

鸣潮120帧解锁新攻略&#xff1a;从困惑到流畅的完整指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否在鸣潮1.2版本更新后&#xff0c;发现原本丝滑的120帧游戏体验突然"消失"了&…

作者头像 李华
网站建设 2026/4/5 18:17:43

WaveTools鸣潮工具箱:5分钟学会120帧解锁与画质优化终极指南

WaveTools鸣潮工具箱&#xff1a;5分钟学会120帧解锁与画质优化终极指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是专门为《鸣潮》玩家打造的一款实用工具&#xff0c;能够轻松…

作者头像 李华
网站建设 2026/4/3 2:39:08

中山大学LaTeX论文模板全攻略:3分钟上手,告别格式烦恼

中山大学LaTeX论文模板全攻略&#xff1a;3分钟上手&#xff0c;告别格式烦恼 【免费下载链接】sysu-thesis 中山大学 LaTeX 论文项目模板 项目地址: https://gitcode.com/gh_mirrors/sy/sysu-thesis 还在为论文格式要求抓狂吗&#xff1f;封面信息填了又改&#xff0c;…

作者头像 李华
网站建设 2026/4/2 8:30:56

流-为序列化解释

流&#xff08;Stream&#xff09;是什么&#xff1f;流&#xff08;Stream&#xff09;是 Java 中用来处理输入和输出&#xff08;I/O&#xff09;操作的基本抽象&#xff0c;它可以用来读取和写入数据。流分为两种&#xff1a;字节流&#xff08;Byte Stream&#xff09;&…

作者头像 李华
网站建设 2026/4/3 10:20:48

鸣潮工具箱3大隐藏玩法揭秘:让你的游戏体验直线飙升!

鸣潮工具箱3大隐藏玩法揭秘&#xff1a;让你的游戏体验直线飙升&#xff01; 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你知道吗&#xff1f;大多数玩家只用了鸣潮工具箱不到30%的功能&#xff01;今…

作者头像 李华