news 2026/3/13 5:30:53

深入解析Java虚拟机垃圾回收机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析Java虚拟机垃圾回收机制

引言

垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一项重要功能,它自动管理内存,回收不再使用的对象,避免内存泄漏和溢出。GC不仅在自动化内存管理上起到至关重要的作用,而且其算法和回收器的选择直接影响着应用程序的性能。本文将详细探讨标记清除算法的缺点、垃圾回收的不同阶段、常见的垃圾回收器如CMS和G1的区别,及如何选择合适的垃圾回收器等内容。

一、标记清除算法的缺点

标记清除算法(Mark-Sweep)是最早的垃圾回收算法之一,它分为两个阶段:

  • 标记阶段:首先标记所有可达的对象,即从根对象出发,递归地标记所有可达的对象。

  • 清除阶段:清除所有未被标记的对象(不可达对象)。

尽管标记清除算法较为简单,但它有以下缺点:

  • 效率低:标记阶段和清除阶段必须遍历堆中的每个对象,尤其是在堆空间较大时,效率较低。

  • 空间碎片:清除阶段只会将不可达的对象从内存中移除,但不会对剩余的内存进行整理。因此,堆内存中可能会出现碎片,影响内存的有效使用。

这些缺点在实际应用中会导致GC的效率问题,并且可能导致内存碎片化,从而降低系统的性能。

二、垃圾回收算法的哪些阶段会Stop-the-World?

Stop-the-World(STW)是指在垃圾回收过程中,所有应用程序线程都会暂停,直到垃圾回收完成。STW暂停时间的长短直接影响应用程序的响应时间。垃圾回收的以下几个阶段会触发STW:

  • 标记阶段:在标记阶段,JVM需要暂停所有应用程序的线程,以便准确地标记可达对象。如果不暂停线程,可能会导致标记错误。

  • 转移阶段:在某些回收算法(如复制算法)中,转移阶段需要将存活的对象从一个区域移动到另一个区域。为了保证数据一致性,所有应用程序线程会暂停。

  • 重定位阶段:重定位阶段涉及调整对象的内存位置,通常发生在堆内存的整理过程中,同样需要STW暂停应用程序。

STW的暂停时间是垃圾回收的瓶颈之一,尤其在低延迟要求的应用中,长时间的STW可能影响用户体验。

三、Minor GC、Major GC、Full GC的区别与触发条件

垃圾回收过程可以分为Minor GCMajor GCFull GC

  • Minor GC:主要针对年轻代(Young Generation)进行回收。新创建的对象首先进入年轻代,当年轻代的内存空间不足时,JVM会触发Minor GC。由于年轻代的对象大多数是短命的,Minor GC通常非常频繁且回收效率较高。

  • Major GC:主要针对老年代(Old Generation)进行回收。当老年代内存不足时,JVM会触发Major GC。相比Minor GC,Major GC的回收时间较长,因为老年代包含了长寿命对象,GC过程中需要做更多的标记和清理工作。

  • Full GC:Full GC会回收年轻代和老年代的所有区域(包括持久代/元空间)。Full GC是最为耗时的GC类型,因为它涉及整个堆内存的回收。触发Full GC的原因通常是老年代空间不足,或者是调用了System.gc()等手动请求垃圾回收的方式。

触发Full GC的场景:

  • 老年代内存不足时,JVM会触发Full GC。

  • 方法区(元空间)空间不足时,JVM会触发Full GC。

  • 手动调用System.gc()方法时。

四、CMS与G1垃圾回收器的区别

CMS(Concurrent Mark-Sweep)垃圾回收器G1(Garbage First)垃圾回收器是两种常见的垃圾回收器,它们各自有不同的特点:

  • 使用范围

    • CMS:适用于低延迟要求的应用程序,尤其在需要避免长时间停顿的系统中。适用于老年代的回收。

    • G1:适用于大堆内存的系统,尤其是对内存碎片较为敏感的应用。

  • STW时间

    • CMS:通过并行标记和清除阶段来减少STW时间,但由于会产生浮动垃圾,某些情况下会导致STW暂停较长。

    • G1:通过划分堆内存为多个小区域,灵活地回收不同区域的垃圾,从而可以更好地控制STW时间。

  • 垃圾碎片

    • CMS:可能会产生浮动垃圾,即某些对象在回收过程中被标记为可回收,但由于并发问题,垃圾回收无法及时清除它们,导致内存碎片。

    • G1:通过分代式回收和区域化管理,减少了垃圾碎片的生成。

  • 垃圾回收过程的不同

    • CMS:采用并行标记、并行清除的方式进行回收。

    • G1:通过多个小区域(Region)的回收和回收优先级策略,确保垃圾回收更加精细和可控。

五、什么情况下使用CMS、什么情况使用G1?

  • CMS适用场景

    • 需要低延迟的应用程序。

    • 对老年代垃圾回收有需求,且要求暂停时间较短。

    • 对垃圾回收的吞吐量有一定要求,但不希望出现长时间的停顿。

  • G1适用场景

    • 对大堆内存系统进行优化,尤其是内存敏感型应用。

    • 对内存碎片比较敏感,希望通过分区和控制回收策略来减少碎片。

    • 需要平衡性能和停顿时间的系统。

六、G1回收器的特点

G1垃圾回收器(Garbage First)是为大内存应用设计的,它通过将堆内存划分为多个小区域(Region),并动态选择回收优先级,来有效地进行垃圾回收。其主要特点包括:

  • 高效的停顿时间控制:通过优先回收垃圾最多的区域,G1能够有效控制停顿时间。

  • 分代式回收:G1结合了年轻代和老年代的回收机制,并且能够根据不同的回收需求来灵活调整。

  • 适应大堆内存:G1特别适用于大堆内存的系统,尤其是对内存碎片敏感的应用。

七、GC只会对堆进行回收吗?还会对方法区进行回收?

GC不仅会回收堆内存,还会对方法区(JDK 8之前的持久代)或元空间(JDK 8及以后)进行回收。具体来说:

  • 堆内存:GC会清理年轻代和老年代的垃圾对象,释放内存空间。

  • 方法区(元空间):随着类的加载和卸载,JVM会进行方法区的回收。在JDK 8之前,方法区是通过持久代实现的,GC会回收不再使用的类元数据;在JDK 8及以后,方法区被元空间取代,元空间的回收由GC负责。

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

大模型微调如何科学评测:从分类到生成任务的指标全解析

本文详细拆解了大模型微调的核心评测指标,针对分类任务介绍了准确率、精确率、召回率和F1值,针对生成任务讲解了BLEU值、ROUGE值和困惑度,并强调了人工评测的重要性。文章提供了实操代码示例,帮助开发者科学评估模型性能&#xff…

作者头像 李华
网站建设 2026/3/7 9:50:12

中小企业必看!5款低代码工具帮你快速搭上业务系统

概述这段时间在帮公司和朋友找低代码平台,陆续试了好几款,发现现在免费低代码工具真的已经很好用了,不懂代码也能自己搭系统、做表单、建流程,效率提升特别明显。整理了一份我亲测觉得不错的平台清单,适合新手、团队、…

作者头像 李华
网站建设 2026/3/3 11:18:16

PGVector 详解:PostgreSQL 世界里的向量能力插件

PGVector 详解:PostgreSQL 世界里的向量能力插件一篇从原理、能力边界到工程实践的 PGVector 全面解析一、PGVector 是什么 PGVector 是 PostgreSQL 的一个扩展(Extension),用于在 PostgreSQL 中引入 向量(Vector&…

作者头像 李华