Java GC 基础知识快速回顾

2025-04-27 0 1,001

目录

一、Java 垃圾回收(GC)基本概念和重要性分析

(一) Java 垃圾回收(GC)基本概念回顾

1.GC 三种常见语义

2.Mutator:应用程序的内存管理角色

3.TLAB(线程本地分配缓存)

4.Card Table(卡表)

(二)为什么了解 GC 对开发者尤为重要,特别是对于性能调优和内存管理

1. 应用性能影响分析

2. 内存管理与泄漏防止

3. 优化应用的资源利用

4. 减少性能瓶颈

5. 实时监控与优化

6. 支持大规模应用与高并发

二、GC 的基本原理

(一)堆(Heap)和栈(Stack)

1.重点关注 堆 和 栈

2.GC核心堆简要

​编辑

堆的核心作用

3. 堆的内存管理与 GC 的配合

(二)垃圾回收的目标

(三)GC 触发机制

1. GC 触发的原因

2. GC 触发的时机

a. Young Generation(年轻代) GC

b. Old Generation(老年代) GC

c. 内存分配失败

3. 如何优化 GC 触发机制?

三、Java回收垃圾的基本过程与常用算法

(一)垃圾分类

(二)垃圾查找

1.查找垃圾时机

2.查找垃圾操作

3.GC Roots

(三)垃圾清理

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

2.标记-复制(Mark-Copy)

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

(四)分代收集算法

1.分代区域描述

2.分代垃圾回收算法执行过程

四、常见的垃圾回收器分析

(一)分代收集(Generational Collection)

(二)分区收集(Region-based Collection)

(三)收集器选择的考虑因素

五、GC 性能调优

六、总结


干货分享,感谢您的阅读!

在 Java 的世界里,内存管理是每个开发者都无法忽视的关键环节。而垃圾回收(GC)作为 Java 内存管理的核心,虽然大多数时候在后台默默工作,却直接影响着应用的性能与稳定性。你是否曾在应用性能问题中迷茫,不知道是内存泄漏导致的崩溃,还是不合适的垃圾回收策略拖慢了响应速度?你是否觉得 GC 似乎总是在不经意间拖慢了应用的运行速度?

让我们一起从垃圾回收的基础开始,探索优化内存管理的无限可能!

历史主要基本文章回顾:

涉猎内容 具体链接
垃圾回收基本知识内容 Java回收垃圾的基本过程与常用算法_java垃圾回收过程-CSDN博客
CMS调优和案例分析 CMS垃圾回收器介绍与优化分析案列整理总结_cms 对老年代的回收做了哪些优化设计-CSDN博客
G1调优分析 Java Hotspot G1 GC的理解总结_java g1-CSDN博客
ZGC基础和调优案例分析 垃圾回收器ZGC应用分析总结-CSDN博客

从ES的JVM配置起步思考JVM常见参数优化

从ES的JVM配置起步思考JVM常见参数优化_es jvm配置-CSDN博客
高频面试题汇总 JVM高频基本面试问题整理_jvm面试题-CSDN博客

一、Java 垃圾回收(GC)基本概念和重要性分析

(一) Java 垃圾回收(GC)基本概念回顾

Java 垃圾回收(Garbage Collection, GC)是 Java 语言内存管理的一项重要机制,它负责自动回收不再使用的内存空间,避免了手动管理内存的复杂性和潜在的内存泄漏问题。

在 Java 中,内存主要分为两部分:堆(Heap)栈(Stack)栈用于存储局部变量和方法调用信息,而堆则用于存储动态分配的对象。每当创建一个对象时,它会被分配到堆中。如果这个对象不再被引用,那么它就成为了垃圾对象,需要被垃圾回收机制回收。

在了解垃圾回收(GC)之前,我们需要先掌握一些与 GC 相关的基础概念。GC 本身可以从不同的角度理解,具体语境下的含义会有所不同。接下来,我们将从几个关键点来讲解这些概念。

1.GC 三种常见语义

  • Garbage Collection(垃圾回收):指的是垃圾回收的技术和过程,是整个内存管理的核心部分。简单来说,它就是“自动清理不再使用的内存”。
  • Garbage Collector(垃圾回收器):这是实现垃圾回收技术的具体组件,也就是负责执行垃圾回收任务的“工具”或“程序”。它确保 JVM 会自动回收不再使用的内存空间。
  • Garbage Collecting(垃圾收集):这是指垃圾回收的实际操作或行为,也就是垃圾回收器具体执行回收的过程。

2.Mutator:应用程序的内存管理角色

在垃圾回收(GC)的过程中,Mutator 是指负责创建对象的部分,通常就是我们的应用程序本身(Mutator 实际上就是应用程序中的工作线程或“应用线程”)。Mutator 可以被视作“垃圾制造者”,因为它不断地在堆内存中分配新的对象,这些对象随着时间的推移将成为“垃圾”——即不再被使用的对象。

可以把 Mutator 理解为一个生产工厂,每次它生产一个对象时,就会在堆内存中占用一定的空间。垃圾回收器则像是一个清理工人,负责定期回收那些不再被需要的对象,以保持内存空间的清洁和高效。Mutator 通过生产新对象不断向内存中添加“垃圾”,而垃圾回收器通过清理这些垃圾来维持系统的性能。

每次 Mutator 分配一个对象时,这个对象通常会被放入堆内存的“年轻代”(Young Generation)区域。这是因为大多数对象在创建后很快就变得不再需要,因此将对象放在年轻代中能够提高回收的效率。垃圾回收器会定期扫描堆内存,查找不再被使用的对象,并回收它们释放内存。

在多线程环境中,每个线程(Mutator 线程)通常会拥有一个 TLAB(线程本地分配缓冲区)。TLAB 是为每个线程分配的专用内存区域,能够减少内存分配时的锁竞争,提高分配效率。这样,每个线程就能独立地快速分配对象,而不必和其他线程争抢内存。

3.TLAB(线程本地分配缓存)

TLAB(Thread Local Allocation Buffer)是指每个线程独享的一块内存区域。为什么需要 TLAB 呢?因为它可以避免多线程环境下的内存分配竞争,提升分配效率。具体来说,当一个线程需要分配内存时,它会首先检查自己的 TLAB 中是否有可用空间。如果有,它就直接在 TLAB 中分配内存,而不需要和其他线程争抢内存资源。

这种机制能显著提高内存分配的速度,减少锁竞争,从而提高程序的性能。TLAB 是通过 CAS(Compare-and-Swap)操作来保证线程安全的。

4.Card Table(卡表)

Card Table,也叫卡表,是用于标记内存页状态的一种数据结构。在 Java 中,堆内存是被划分成多个小块的(我们可以把这些小块称为“卡页”)Card Table 用来记录哪些卡页已经被修改过,具体来说,记录了某个卡页中是否有指向其他内存区域(例如老年代)对象的引用。

Card Table 的作用是帮助垃圾回收器更高效地处理跨代引用。什么是跨代引用呢?就是说,一个年轻代的对象可能会引用到老年代的对象。为了在垃圾回收过程中快速查找这些跨代引用,Card Table 会标记出这些卡页的状态。

当一个线程修改了某个对象的引用(例如从年轻代的对象引用了老年代的对象),它会触发一个写屏障(Write Barrier),然后 Card Table 会将相关卡页标记为“脏”。在垃圾回收时,GC 就能更高效地查找并回收不再使用的对象。

这些概念看似简单,但它们构成了垃圾回收机制的核心内容,掌握它们可以帮助我们更好地理解 JVM 是如何管理内存的,以及如何通过优化 GC 来提升程序的性能。为了避免 GC 中的停顿时间过长,我们需要在理解这些概念的基础上,选择合适的回收策略和优化方案。

(二)为什么了解 GC 对开发者尤为重要,特别是对于性能调优和内存管理

1. 应用性能影响分析

  • GC 暂停时间:垃圾回收会占用 CPU 资源,并可能导致应用程序在 GC 执行期间出现“停顿”。虽然 GC 在后台运行,但如果没有优化,停顿时间可能会影响应用的响应时间和吞吐量,尤其是在高并发或实时性要求较高的系统中。因此,开发者需要理解 GC 的工作原理,以便在需要时进行调优,减少不必要的停顿。
  • 吞吐量GC 的效率直接影响到 Java 应用的吞吐量(即单位时间内能够处理的任务量)。不同的 GC 算法会影响吞吐量,因此了解如何配置 GC 和选择合适的回收器可以提升系统性能。

2. 内存管理与泄漏防止

  • 堆内存管理:GC 负责管理堆内存,在堆中动态创建和销毁对象。虽然 GC 能自动回收不再使用的对象,但开发者必须了解何时以及如何创建对象,以避免过度的对象分配或无效对象的持续存在,这会导致内存占用不断增加,甚至出现内存泄漏。
  • 内存泄漏:虽然 GC 可以自动回收大多数不再使用的对象,但开发者仍需确保对象引用正确地清理。如果对象的引用未能正确释放,GC 也无法识别它们为垃圾,可能会导致内存泄漏。了解 GC 的工作原理可以帮助开发者避免这种情况。

3. 优化应用的资源利用

  • 堆的大小和分代设置:开发者可以通过设置 JVM 参数来调整堆的大小、分代的划分以及垃圾回收策略,以便最大化内存的利用效率。如果堆设置过小,频繁的 GC 会造成性能损失;如果堆设置过大,则可能导致长时间的 GC 停顿。通过理解 GC,开发者可以精细调控应用的内存使用。
  • 垃圾回收器选择:不同的垃圾回收器(如 Serial, Parallel, CMS, G1 等)适用于不同的应用场景。选择合适的回收器可以帮助在高吞吐量、低延迟或低内存占用等方面做出权衡。开发者需要根据应用的特点选择最适合的回收器,以优化资源利用。

4. 减少性能瓶颈

  • 多线程与并发:现代的垃圾回收器(如 G1、ZGC)支持多线程并发回收,这能显著减少 GC 停顿时间。开发者可以通过调整并发设置、调整回收策略来进一步减少性能瓶颈,提升系统响应速度。
  • 分代收集与垃圾回收算法:Java 使用分代回收策略,年轻代对象和老年代对象有不同的回收方式。了解这些差异,可以帮助开发者避免过度频繁的年轻代回收,或优化老年代的回收策略,从而减少 GC 的负担。

5. 实时监控与优化

  • GC 日志分析:通过分析 GC 日志,开发者可以识别内存使用情况,找出可能的性能瓶颈和内存问题。GC 日志能提供很多有价值的信息,帮助开发者理解应用在运行过程中如何与垃圾回收器交互,以及在什么情况下会发生长时间的

平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/145668734

遇见资源网 JAVA Java GC 基础知识快速回顾 http://www.ox520.com/157387.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务