Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM垃圾回收器的原理和调优详解!

JVM垃圾回收器的原理和调优详解!

原创
作者头像
喵手
发布于 2025-01-15 00:44:38
发布于 2025-01-15 00:44:38
2210
举报
文章被收录于专栏:Java实践Java实践

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在上一期《JVM 对代码的几种优化手段》中,我们探讨了 JVM 如何通过即时编译(JIT)、逃逸分析、内联优化等技术来提升程序性能。这些优化手段为我们编写高效的 Java 程序提供了强大支持。然而,程序的运行不仅仅依赖于代码执行的效率,还涉及 内存管理 的有效性。

内存管理是 JVM 的核心功能之一,而 垃圾回收器(Garbage Collector, GC) 则是内存管理的关键角色。本期内容,我们将深入探讨 JVM 中垃圾回收器的工作原理,并学习如何通过调优策略提升 GC 的效率。对于 Java 开发者来说,理解垃圾回收器的运行机制以及调优技巧,是掌握 JVM 性能优化的必经之路。


摘要

本文将通过理论与实践相结合的方式,带你了解 JVM 垃圾回收器的原理、分类及调优策略。主要内容包括:

  • 垃圾回收的基础理论:JVM 内存模型与 GC 的工作机制。
  • JVM 中常见垃圾回收器的特点与适用场景。
  • 如何分析 GC 日志,并通过调优参数优化性能。
  • 实战案例:如何调优 JVM 参数以提升应用性能。
  • 垃圾回收的优缺点分析与开发中的常见问题。

通过本文的学习,你将掌握从理论到实战的完整 GC 优化技能,为你的 Java 应用程序提供坚实的性能保障。


概述

垃圾回收(Garbage Collection, GC) 是 Java 实现自动内存管理的重要组成部分。GC 的作用是回收不再被使用的对象占用的内存空间,以便分配给新的对象,同时避免内存泄漏或溢出问题。

JVM 中的垃圾回收主要针对以下区域进行管理:

  1. 堆(Heap):存放对象实例,GC 的主要工作区域。
  2. 方法区(Metaspace):存放类元数据,GC 也会在某些情况下回收这里的空间。

垃圾回收器通过以下几个步骤完成回收任务:

  1. 标记(Mark):标记所有存活的对象。
  2. 清除(Sweep):清除未被标记的对象。
  3. 整理(Compact):对存活对象进行整理,减少内存碎片。

垃圾回收器的实现基于 JVM 提供的内存分代模型:

  • 新生代:存放生命周期较短的对象,分为 Eden 和 Survivor 区。
  • 老年代:存放生命周期较长的对象。
  • 永久代/元空间:存放类元数据。

垃圾回收器分类及原理

JVM 提供了多种垃圾回收器,不同回收器适用于不同的应用场景。以下是几种常见垃圾回收器的特点和原理。

1. Serial 垃圾回收器

  • 特点:单线程工作,简单高效。
  • 适用场景:适用于单线程或小型应用。
  • 工作原理:在 GC 过程中,暂停所有用户线程(Stop-The-World, STW),依次执行标记、清除和整理操作。
代码语言:bash
AI代码解释
复制
-XX:+UseSerialGC

2. Parallel 垃圾回收器

  • 特点:多线程并行回收,注重吞吐量。
  • 适用场景:适用于后台批处理或大数据场景。
  • 工作原理:使用多个线程并行处理新生代和老年代的回收任务。
代码语言:bash
AI代码解释
复制
-XX:+UseParallelGC

3. CMS 垃圾回收器

  • 特点:低延迟回收,适合对响应时间敏感的应用。
  • 适用场景:Web 应用、在线交易系统。
  • 工作原理:分为初始标记、并发标记、重新标记和并发清理四个阶段,减少 STW 时间。
代码语言:bash
AI代码解释
复制
-XX:+UseConcMarkSweepGC

4. G1 垃圾回收器

  • 特点:区域化回收,兼顾吞吐量和低延迟。
  • 适用场景:需要处理大堆内存的应用。
  • 工作原理:将堆分为多个区域(Region),按优先级回收垃圾最多的区域。
代码语言:bash
AI代码解释
复制
-XX:+UseG1GC

源码解析

以下代码展示了 JVM 内存分代模型和垃圾回收的基本逻辑。

示例代码

代码语言:java
AI代码解释
复制
public class GCDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            allocateMemory(); // 模拟内存分配
        }
    }

    private static void allocateMemory() {
        byte[] array = new byte[1024 * 1024]; // 分配 1MB 空间
        System.out.println("Allocated 1MB memory");
    }
}

运行时可以通过 JVM 参数查看垃圾回收过程:

代码语言:bash
AI代码解释
复制
java -Xmx50m -Xms50m -XX:+PrintGCDetails -XX:+UseG1GC GCDemo

运行结果(部分 GC 日志):

代码语言:plaintext
AI代码解释
复制
[GC pause (G1 Evacuation Pause) 12M->8M(50M), 0.0051236 secs]
[GC pause (G1 Humongous Allocation) 16M->12M(50M), 0.0032345 secs]

使用案例分享

案例 1:Web 服务的 GC 调优

一个高并发的 Web 服务使用 CMS 垃圾回收器,GC 频繁触发且导致长时间停顿,影响了用户体验。通过以下参数调整,显著降低了停顿时间:

代码语言:bash
AI代码解释
复制
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly

调整后,GC 触发阈值提升到 70%,减少了频繁的回收,同时保证了低延迟。

案例 2:大数据任务的 GC 优化

一个处理海量数据的批处理任务,使用 Parallel 垃圾回收器,GC 停顿时间过长。通过以下参数优化,提高了吞吐量:

代码语言:bash
AI代码解释
复制
-XX:+UseParallelGC
-XX:ParallelGCThreads=8
-XX:MaxGCPauseMillis=200

优化后,GC 停顿时间降低至 200 毫秒以内,任务处理效率大幅提升。


应用场景案例

  1. 低延迟系统:如在线支付、电子商务系统,适合使用 CMS 或 G1 垃圾回收器。
  2. 高吞吐量系统:如批处理、大数据系统,适合使用 Parallel 垃圾回收器。
  3. 大内存应用:如实时分析平台,适合使用 G1 垃圾回收器。

垃圾回收调优策略

  1. 分析 GC 日志:通过 -XX:+PrintGCDetails 查看 GC 情况。
  2. 选择合适的回收器:根据应用场景选择合适的 GC。
  3. 设置合理的内存分配
    • -Xms-Xmx 设置一致,避免频繁调整堆大小。
  4. 调优 GC 参数:根据需求调整线程数、暂停时间等参数。

优缺点分析

优点

  • 自动内存管理,减少开发者负担。
  • 多种垃圾回收器可选,适配不同场景。
  • 分代模型提升了内存分配和回收效率。

缺点

  • GC 停顿可能导致性能问题。
  • 调优复杂,需深入了解 JVM 运行原理。
  • 部分场景可能出现无法解决的 Full GC 问题。

核心类方法介绍

  1. java.lang.ref.Reference:用于处理软引用、弱引用和虚引用。
  2. java.lang.Runtime:提供获取 JVM 内存信息的方法,如 totalMemoryfreeMemory
  3. java.lang.management.MemoryMXBean:监控 JVM 的内存使用情况。

测试用例

代码语言:java
AI代码解释
复制
import org.junit.Test;

public class GCTest {

    @Test
    public void testGCMemoryAllocation() {
        byte[] array = new byte[1024 * 1024]; // 分配 1MB 空间
        assert array.length == 1024 * 1024;
    }

    @Test
    public void testGCBehavior() {
        for (int i = 0; i < 1000; i++) {
            byte[] array = new byte[1024 * 1024]; // 模拟内存分配
        }
        System.gc(); // 手动触发 GC
    }
}

小结

垃圾回收是 JVM 提升内存管理效率的重要机制。通过了解垃圾回收器的分类、原理和调优方法,开发者可以针对不同的应用场景选择合适的 GC 策略,从而提升系统性能。


总结

在本期中,我们深入探讨了 JVM 垃圾回收器的工作原理及调优策略。从 Serial 到 G1,每种垃圾回收器都有其独特的应用场景和优势。通过调优 GC 参数,我们可以进一步提升 Java 应用的性能。

下一期,我们将继续 JVM 性能优化系列,探讨 多线程与并发优化的实战技巧。希望本文能为你的 JVM 调优实践提供帮助!


文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

***

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM之垃圾回收器
有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。
冬天vs不冷
2025/01/20
1650
JVM之垃圾回收器
G1垃圾回收器
垃圾回收器在现代编程语言中扮演着重要角色,它自动管理内存分配和回收,避免了内存泄漏等问题。Java的垃圾回收机制经历了多年的发展,从Serial GC、Parallel GC、CMS,再到G1 GC。G1垃圾回收器,作为Java 7及以后的版本中重要的GC选项,旨在提供可预测的暂停时间并提高多核处理器的利用率。
九转成圣
2024/08/05
1210
Java垃圾回收器(GC):什么是垃圾回收?如何选择 G1、ZGC 与 Shenandoah?
本文将通过丰富的代码示例深入讲解垃圾回收(Garbage Collection)的核心概念,比较 G1、ZGC 与 Shenandoah 的特性,提供调优技巧,助你选择最适合的 GC。
猫头虎
2024/12/24
5250
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
开篇,先推荐一篇实用的文章《Java并发编程学习13-任务取消的进阶使用》,作者是【huazie】。
拉丁解牛说技术
2024/11/26
2560
CMS(Concurrent Mark-Sweep)垃圾回收器
在现代Java应用中,垃圾回收(Garbage Collection, GC)是性能优化的关键之一。它自动管理内存,避免内存泄漏和手动管理的复杂性。CMS(Concurrent Mark-Sweep)是一种低延迟的垃圾回收器,设计用于减少应用程序停顿时间。
九转成圣
2024/08/05
1410
JVM垃圾回收
当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
Vincent-yuan
2021/09/01
4400
JVM垃圾回收
JVM实战—5.G1垃圾回收器的原理和调优
Stop the World是最大的问题。无论是新生代GC还是老年代GC,都会或多或少产生STW现象,这对系统的运行是有一定影响的。
东阳马生架构
2025/03/14
930
Hotspot JVM垃圾回收器
  前两篇《JVM入门——运行时数据区》《JVM常见垃圾回收算法》所提到的实际上JVM规范以及常用的垃圾回收算法,具体的JVM实现实际上不止一种,有JRockit、J9等待,当然最有名当属HotSpo
用户1148394
2018/01/12
8690
Hotspot JVM垃圾回收器
Java JVM 面试题
阿彬学java
2025/01/09
1110
为什么G1 GC从JDK 9之后成为默认的垃圾回收器?
目前JVM提供的正式垃圾回收器有并行、串行、CMS和G1。这四种垃圾回收器都是基于分代内存管理。分代管理就是把内存划分成不同的区域进行管理,其思想来源是:有些对象存活的时间短,有些对象存活的时间长,把存活时间短的对象放在一个区域管理,把存活时间长的对象放在另一个区域管理,那么可以为两个不同的区域选择不同的算法,加快垃圾回收的效率。我们假定内存被划分成2个代,新生代和老生代。把容易死亡的对象放在新生代,通常采用复制算法回收,把预期存活时间较长的对象放在老生代,通常采用标记清除算法。
Java团长
2019/05/17
5.6K0
JVM垃圾回收器原理及使用介绍
Java语音的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担。
海仔
2019/08/06
4380
深入理解Java的G1垃圾回收器
本文旨在深入探讨Java虚拟机(JVM)中的G1垃圾回收器,包括其工作原理、性能特点、配置调优以及实际使用中的代码示例。G1垃圾回收器以其并行与并发能力、停顿时间可预测性在高性能Java应用中备受青睐。
灬沙师弟
2024/02/22
5620
深入理解Java的G1垃圾回收器
JVM简介—2.垃圾回收器和内存分配策略
给对象添加一个引用计数器,每当一个地方引用它时就将计数器加1,当引用失效时就将计数器减1,任何时刻计数器为0的对象都不再被使用。
东阳马生架构
2025/03/10
1020
Java虚拟机(JVM):内存模型、垃圾回收、性能调优与最佳实践
Java虚拟机(JVM)是Java应用程序的运行环境,它具有独特的内存管理机制和垃圾回收策略,同时提供了一系列参数供开发人员调优。本文将深入探讨JVM内存模型、垃圾回收算法、垃圾回收器类型以及性能调优的最佳实践,帮助您更好地理解和优化Java应用程序。
疯狂的KK
2023/09/25
3.1K0
Java虚拟机(JVM):内存模型、垃圾回收、性能调优与最佳实践
Java JVM调优秘籍:让垃圾回收不再是“垃圾”!
在Java的世界里,JVM(Java虚拟机)是每个开发者的幕后英雄。它不仅负责运行Java程序,还默默地处理内存管理、垃圾回收等核心任务。但是,你知道吗?通过精心调优JVM,我们可以让它的性能发挥到极致,让应用程序运行得更加流畅和高效。本文将带你深入了解JVM调优的奥秘,让你的Java应用飞起来!
疯狂的KK
2024/03/11
5290
Java JVM调优秘籍:让垃圾回收不再是“垃圾”!
先有JVM还是先有垃圾回收器?
是先有垃圾回收器再有JVM呢,还是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?历史上还真是垃圾回收更早面世,垃圾回收最早起源于1960年诞生的LISP语言,Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析JVM的垃圾回收~
JavaSouth南哥
2024/05/14
4520
先有JVM还是先有垃圾回收器?
JVM垃圾回收器_jdk6默认垃圾回收器
如果说垃圾回收算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现,下图展示了7中作用于不同分代的收集器。其中用于新生代的回收器包括Serial,PraNew,Parallel Scavenge,回收老年代的收集器包括 Serial Old ,Parallel old,CMS,还有作用于回收整个java堆的G1收集器,不同收集器之间的连线表示他们可以搭配使用。
全栈程序员站长
2022/10/01
6840
JVM垃圾回收器_jdk6默认垃圾回收器
Java虚拟机(JVM)的奥秘:优化、组成与垃圾回收(GC)调优
在Java开发的世界里,JVM是一个不可或缺的核心组件。它不仅为我们提供了跨平台的能力,还为我们处理内存管理、线程调度等底层细节。但是,随着应用规模的增长,JVM的性能优化成为了开发者必须面对的挑战。本文将带你深入了解JVM的优化策略、组成结构以及垃圾回收(GC)的工作原理和调优方法,并通过代码示例来加深理解。让我们一起探索如何让Java应用在JVM上运行得更加高效。
疯狂的KK
2024/03/11
9170
Java虚拟机(JVM)的奥秘:优化、组成与垃圾回收(GC)调优
JVM问题排查和垃圾回收机制
GC Roots是垃圾回收器的起点,直接或间接地与GC Roots相关的对象就不会被回收。主要的GC Roots有:
青山师
2023/10/17
2550
JVM | 垃圾回收器(GC)- Java内存管理的守护者
在编程世界中,有效的内存管理是至关重要的。这不仅确保了应用程序的稳定运行,还可以大大提高性能和响应速度。作为世界上最受欢迎的编程语言之一,通过Java虚拟机内部的垃圾回收器组件来自动管理内存,是成为之一的其中一项必不可少的技术点。
kfaino
2023/12/04
7160
JVM | 垃圾回收器(GC)- Java内存管理的守护者
相关推荐
JVM之垃圾回收器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档