当前位置: 首页 > news >正文

学习笔记06——JVM调优

JVM 调优实战:性能优化的技巧与实战

在 Java 开发中,JVM(Java Virtual Machine)作为 Java 程序的运行环境,其性能直接影响到应用程序的响应速度和吞吐量。合理的 JVM 调优可以显著提升应用性能,降低延迟,提高资源利用率。本文将深入探讨 JVM 调优的核心概念、常用工具和实战技巧,帮助开发者更好地理解和优化 JVM。

一、JVM 调优的核心目标

为什么需要jvm调优

  • 典型问题:频繁Full GC导致应用卡顿、内存溢出(OOM)、Young GC耗时过长、吞吐量下降等。

  • 核心目标:在有限的资源下,通过合理配置实现更低延迟更高吞吐量更稳定的服务

JVM 调优的核心目标是通过调整 JVM 的参数和配置,使应用程序在特定的硬件和软件环境下达到最佳性能。具体来说,JVM 调优的目标包括:

  1. 降低延迟:减少应用程序的响应时间,特别是在高并发场景下。

  2. 提高吞吐量:增加应用程序在单位时间内处理的请求数量。

  3. 优化资源利用率:合理利用 CPU、内存等系统资源,避免资源浪费。

  4. 提高稳定性:减少因内存溢出或 GC(Garbage Collection)问题导致的应用崩溃。

二、JVM 内存结构与 GC 机制

在进行 JVM 调优之前,了解 JVM 的内存结构和垃圾回收机制是基础。JVM 内存主要分为以下几个区域:

  1. 堆(Heap):用于存储对象实例和数组,是 GC 的主要管理区域。

  2. 栈(Stack):每个线程都有自己的栈,用于存储局部变量、方法调用等。

  3. 方法区(Method Area):存储类的元数据、常量池等。

  4. 程序计数器(Program Counter Register):记录当前线程执行的字节码行号。

1. 垃圾回收机制

垃圾回收(GC)是 JVM 自动管理内存的重要机制。GC 的主要任务是识别和清理不再使用的对象,释放内存空间。常见的 GC 算法包括:

  1. 标记-清除算法(Mark-Sweep):标记活动对象,然后清除未标记的对象,简单,但是容易产生内存碎片。

  2. 复制算法(Copying):将活动对象从一个空间复制到另一个空间,清理原空间,适合新生代。

  3. 标记-压缩算法(Mark-Compact):标记活动对象,然后将它们压缩到内存的一端,清理剩余空间,适合老年代。

  4. 分代收集算法(Generational Collection):将堆分为新生代和老年代,分别使用不同的 GC 算法,JVM主流策略,结合不同算法管理不同区域。

2.常见的垃圾收集器

  • 串行收集器(Serial):单线程,适合客户端应用。

  • 并行收集器(Parallel Scavenge/Old):吞吐量优先。

  • CMS:低延迟,但存在内存碎片问题。

  • G1:面向大内存、低延迟场景,分区回收。

  • ZGC/Shenandoah:亚毫秒级延迟,适用于超大堆。

三、JVM 调优的关键参数

JVM 提供了丰富的参数来控制内存分配和垃圾回收行为。以下是一些常用的调优参数:

1. 堆内存大小

  • -Xms:设置初始堆内存大小。

  • -Xmx:设置最大堆内存大小。

2. 新生代和老年代大小

  • -Xmn:设置新生代内存大小。

  • -XX:NewRatio:设置新生代和老年代的比例。

3. GC 算法选择

  • -XX:+UseSerialGC:使用串行 GC 算法。

  • -XX:+UseParallelGC:使用并行 GC 算法。

  • -XX:+UseConcMarkSweepGC:使用 CMS GC 算法。

  • -XX:+UseG1GC:使用 G1 GC 算法。

4. GC 日志输出

  • -XX:+PrintGCDetails:输出 GC 详细日志。

  • -XX:+PrintGCTimeStamps:输出 GC 时间戳。

  • -Xloggc:gc.log:指定 GC 日志文件路径。

5. 垃圾回收停顿时间

  • -XX:MaxGCPauseMillis:设置最大 GC 停顿时间。

  • -XX:GCTimeRatio:设置 GC 时间与应用运行时间的比例。

四、JVM调优核心步骤

1. 确定性能瓶颈
  • 工具jstatjmapVisualVMArthas、GC日志分析。

  • 关键指标

    • GC频率与耗时(Young GC/Full GC)。

    • 堆内存各区域使用率。

    • 线程阻塞与锁竞争情况。

2. 内存分配调优
  • 堆大小:初始值(-Xms)与最大值(-Xmx)设为相同,避免动态调整开销。

  • 新生代与老年代比例:默认-XX:NewRatio=2(老年代:新生代=2:1),高吞吐场景可增大新生代。

  • Survivor区优化-XX:SurvivorRatio=8(Eden:S0:S1 =8:1:1),避免对象过早晋升老年代。

3. 选择合适的GC器
  • 高吞吐场景Parallel Scavenge + Parallel Old

  • 低延迟场景G1(JDK9+默认)或ZGC(JDK11+)。

  • 示例参数

    # G1调优示例
    -XX:+UseG1GC 
    -XX:MaxGCPauseMillis=200  # 目标最大停顿时间
    -XX:G1NewSizePercent=30   # 新生代最小占比
  • 监控与日志分析
    • 开启GC日志

      -Xloggc:/path/to/gc.log 
      -XX:+PrintGCDetails 
      -XX:+PrintGCDateStamps
    • 工具推荐:GCViewer、GCEasy在线分析。

五、JVM 调优的常用工具

JVM 提供了多种工具来监控和分析 JVM 的运行状态,帮助开发者进行调优。

1. VisualVM

VisualVM 是一个功能强大的 JVM 调优工具,可以监控 JVM 的内存使用情况、线程状态、GC 活动等。它还支持生成堆转储文件和线程转储文件,方便分析内存泄漏和线程问题。

2. JConsole

JConsole 是一个基于 JMX(Java Management Extensions)的监控工具,可以实时监控 JVM 的内存、线程、GC 等信息。它还支持远程监控,方便在生产环境中使用。

3. MAT(Memory Analyzer Tool)

MAT 是一个专业的内存分析工具,可以分析堆转储文件,帮助开发者定位内存泄漏和内存溢出问题。它提供了多种视图和分析功能,如直方图、支配树、泄漏嫌疑等。

4. GC 日志分析工具

  • GCeasy:一个在线的 GC 日志分析工具,可以自动分析 GC 日志,生成详细的报告。

  • GCEasy:支持多种 GC 日志格式,提供 GC 停顿时间、吞吐量、内存使用等分析。

六、JVM 调优的实战技巧

1. 确定调优目标

在进行 JVM 调优之前,明确调优目标是非常重要的。例如,是降低延迟还是提高吞吐量?是优化内存使用还是减少 GC 停顿时间?明确目标可以帮助开发者更有针对性地进行调优。

2. 分析应用特点

不同的应用有不同的特点,例如:

  • 高并发应用:需要关注线程池配置、锁竞争等问题。

  • 内存密集型应用:需要关注堆内存大小、GC 算法选择等。

  • 计算密集型应用:需要关注 CPU 使用率、线程数等。

3. 选择合适的 GC 算法

不同的 GC 算法有不同的特点,选择合适的 GC 算法是 JVM 调优的关键。例如:

  • Serial GC:适合单线程环境,简单高效。

  • Parallel GC:适合多线程环境,注重吞吐量。

  • CMS GC:适合低延迟场景,但可能导致内存碎片。

  • G1 GC:适合大堆内存场景,注重平衡吞吐量和延迟。

4. 调整堆内存大小

堆内存大小直接影响到 GC 的频率和停顿时间。通常建议将堆内存设置为物理内存的 50% 到 80%。过小的堆内存会导致频繁的 GC,过大的堆内存会导致 GC 停顿时间过长。

5. 优化新生代和老年代比例

新生代和老年代的比例会影响 GC 的效率。通常建议将新生代设置为堆内存的 1/3 到 1/4,老年代设置为剩余部分。可以通过 -XX:NewRatio 参数调整新生代和老年代的比例。

6. 监控和分析 GC 日志

GC 日志是 JVM 调优的重要依据。通过监控和分析 GC 日志,可以了解 GC 的频率、停顿时间、内存使用情况等。可以使用 VisualVM、JConsole 等工具监控 GC 日志,也可以使用 GCEasy 等工具分析 GC 日志。

7. 优化代码

除了调整 JVM 参数,优化代码也是提高性能的重要手段。例如:

  • 减少对象创建:过多的对象创建会导致频繁的 GC。

  • 使用对象池:对于频繁创建和销毁的对象,可以使用对象池复用对象。

  • 优化数据结构:选择合适的数据结构可以提高性能。

七、JVM 调优的案例分析

场景1:某电商服务频繁Full GC,接口响应超时。

  1. 问题分析

    • jstat -gcutil显示老年代占用率持续99%。

    • GC日志显示Full GC每小时触发3-4次,每次耗时1.5秒。

  2. 根因定位

    • 内存泄漏:通过jmap -histo发现大量未释放的订单缓存对象。

    • 新生代过小:对象快速晋升老年代。

  3. 解决方案

    • 修复内存泄漏代码(缓存设置TTL)。

    • 调整堆大小与分代比例:

      -Xms4g -Xmx4g 
      -XX:NewRatio=1          # 新生代占比提高至50%
      -XX:SurvivorRatio=6     # Eden:S0:S1=6:1:1
    • 切换为G1收集器,限制最大停顿时间。

  4. 效果:Full GC降为每天1次,接口P99延迟降低60%。

场景2:支付系统的低延迟调优

问题:支付接口P99延迟超过200ms,GC停顿(尤其是Full GC)占比30%。

分析与调优

  1. GC日志分析

    • 使用G1收集器,但MaxGCPauseMillis=200ms未生效,Young GC平均耗时50ms,Full GC耗时1.2秒。

    • 对象分配速率过高(2GB/s),Eden区频繁填满。

  2. 调优措施

    • 升级JDK:从JDK11升级到JDK17,启用ZGC(-XX:+UseZGC),利用其并发压缩和亚毫秒级停顿特性。

    • 控制分配速率:优化代码减少临时对象(如JSON序列化替换为二进制协议)。

    • 堆外内存管理:使用ByteBuffer.allocateDirect缓存高频交易数据,减少堆压力。

    • 参数调整

      -Xmx16g -Xms16g                # 固定堆大小,避免动态扩展  
      -XX:ZAllocationSpikeTolerance=5 # 控制ZGC触发敏感度  
      -XX:+UseLargePages              # 提升内存访问效率  
  3. 效果

    • GC停顿降至0.5ms以下,支付接口P99延迟降低至80ms。

场景3:交易系统的线程竞争优化

问题:订单撮合引擎在高并发时吞吐量下降,jstack显示大量线程阻塞。

分析与调优

  1. 线程分析

    • 使用jstack <pid>抓取线程栈,发现90%的线程阻塞在ConcurrentHashMap.put()方法。

    • 进一步分析代码,发现交易订单的分库路由算法未均匀分布,导致热点Key。

  2. 调优措施

    • 数据结构优化:将全局缓存拆分为分片缓存(如使用ConcurrentHashMap数组)。

    • 锁粒度细化:改用StampedLock替代synchronized,减少锁竞争。

    • JVM参数调整

      -XX:+UseNUMA                  # 优化多核内存访问  
      -XX:CICompilerCount=4         # 增加JIT编译线程数  
      -Xss512k                      # 减少线程栈大小,支持更多线程  
  3. 效果

    • 吞吐量提升3倍,线程阻塞率从40%降至5%以下。

七、总结

JVM 调优是一个复杂而细致的工作,需要结合应用的特点和运行环境进行调整。通过合理设置 JVM 参数、选择合适的 GC 算法、监控和分析 GC 日志,可以显著提升应用性能,降低延迟,提高资源利用率。希望本文的内容能够帮助开发者更好地理解和优化 JVM,提升应用性能。

相关文章:

学习笔记06——JVM调优

JVM 调优实战&#xff1a;性能优化的技巧与实战 在 Java 开发中&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;作为 Java 程序的运行环境&#xff0c;其性能直接影响到应用程序的响应速度和吞吐量。合理的 JVM 调优可以显著提升应用性能&#xff0c;降低延迟&a…...

深度学习(3)-TensorFlow入门(常数张量和变量)

低阶张量操作是所有现代机器学习的底层架构&#xff0c;可以转化为TensorFlow API。 张量&#xff0c;包括存储神经网络状态的特殊张量&#xff08;变量&#xff09;​。 张量运算&#xff0c;比如加法、relu、matmul。 反向传播&#xff0c;一种计算数学表达式梯度的方法&…...

3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

【GO】学习笔记

目录 学习链接 开发环境 开发工具 GVM - GO多版本部署 GOPATH 与 go.mod go常用命令 环境初始化 编译与运行 GDB -- GNU 调试器 基本语法与字符类型 关键字与标识符 格式化占位符 基本语法 初始值&零值&默认值 变量声明与赋值 _ 下划线的用法 字…...

【TypeScript】ts在vue中的使用

目录 一、Vue 3 TypeScript 1. 项目创建与配置 项目创建 关键配置文件 2.完整项目结构示例 3. 组件 Props 类型定义 4. 响应式数据与 Ref 5. Composition 函数复用 二、组件开发 1.组合式API&#xff08;Composition API&#xff09; 2.选项式API&#xff08;Options…...

2025前端框架最新组件解析与实战技巧:Vue与React的革新之路

作者&#xff1a;飞天大河豚 引言 2025年的前端开发领域&#xff0c;Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化&#xff0c;两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…...

Elasticsearch 的分布式架构原理:通俗易懂版

Elasticsearch 的分布式架构原理&#xff1a;通俗易懂版 Lucene 和 Elasticsearch 的前世今生 Lucene 是一个功能强大的搜索库&#xff0c;提供了高效的全文检索能力。然而&#xff0c;直接基于 Lucene 开发非常复杂&#xff0c;即使是简单的功能也需要编写大量的 Java 代码&…...

【DeepSeek】【GPT-Academic】:DeepSeek集成到GPT-Academic(官方+第三方)

目录 1 官方deepseek 1.1 拉取学术GPT项目 1.2 安装依赖 1.3 修改配置文件中的DEEPSEEK_API_KEY 2 第三方API 2.1 修改DEEPSEEK_API_KEY 2.2 修改CUSTOM_API_KEY_PATTERM 2.3 地址重定向 2.4 修改模型参数 2.5 成功调用 2.6 尝试添加一个deepseek-r1参数 3 使用千帆…...

2.部署kafka:9092

官方文档&#xff1a;http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境&#xff1a; 操作系统: centos7 防火墙&#xff1a;全关 3台zookeeper集群内的机器&#xff0c;1台logstash 软件版本: …...

学习路之PHP --TP6异步执行功能 (无需安装任何框架)

学习路之PHP --异步执行功能 &#xff08;无需安装任何框架&#xff09; 简介一、工具类二、调用三、异步任务的操作四、效果&#xff1a; 简介 执行异步任务是一种很常见的需求&#xff0c;如批量发邮箱&#xff0c;短信等等执行耗时任务时&#xff0c;需要程序异步执行&…...

Uniapp 小程序复制、粘贴功能实现

在开发 Uniapp 小程序的过程中&#xff0c;复制和粘贴功能是非常实用且常见的交互需求。今天&#xff0c;我就来和大家详细分享如何在 Uniapp 中实现这两个功能。 复制功能&#xff1a;uni.setClipboardData方法 goResult() {uni.setClipboardData({data: this.copyContent, /…...

seacmsv9注入管理员账号密码+orderby+limit

一、seacmsv9 SQL注入漏洞 查看源码 <?php session_start(); require_once("include/common.php"); //前置跳转start $cs$_SERVER["REQUEST_URI"]; if($GLOBALS[cfg_mskin]3 AND $GLOBALS[isMobile]1){header("location:$cfg_mhost$cs");}…...

多通道数据采集和信号生成的模块化仪器如何重构飞机电子可靠性测试体系?

飞机的核心电子系统包括发电与配电系统&#xff0c;飞机内部所有设备和系统之间的内部数据通信系统&#xff0c;以及用于外部通信的射频设备。其他所有航空电子元件都依赖这些关键总线进行电力传输或数据通信。在本文中&#xff0c;我们将了解模块化仪器&#xff08;无论是PCIe…...

天润融通分析DeepSeek如何一键完成从PR接入,到真正的业务接入

DeepSeek出圈之后&#xff0c;市场上很快掀起了一波DeepSeek接入潮。 在客户服务领域&#xff0c;许多企业见识到DeepSeek的超强能力后&#xff0c;也迅速接入DeepSeek并获得了不错的效果。 比如在客户接待服务场景&#xff0c;有企业将DeepSeek应用到智能问答助手&#xff0…...

免费PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解决您所有PD…...

PyTorch 源码学习:GPU 内存管理之它山之石——TensorFlow BFC 算法

TensorFlow 和 PyTorch 都是常用的深度学习框架&#xff0c;各自有一套独特但又相似的 GPU 内存管理机制&#xff08;BFC 算法&#xff09;。它山之石可以攻玉。了解 TensorFlow 的 BFC 算法有助于学习 PyTorch 管理 GPU 内存的精妙之处。本文重点关注 TensorFlow BFC 算法的核…...

【学写LibreCAD】1 LibreCAD主程序

一、源码 头文件&#xff1a; #ifndef MAIN_H #define MAIN_H#include<QStringList>#define STR(x) #x #define XSTR(x) STR(x)/*** brief handleArgs* param argc cli argument counter from main()* param argv cli arguments from main()* param argClean a list…...

Android Studio超级详细讲解下载、安装配置教程(建议收藏)

博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战&#xff0c;深受全网粉丝喜爱与支持✌有…...

CDN与群联云防护的技术差异在哪?

CDN&#xff08;内容分发网络&#xff09;与群联云防护是两种常用于提升网站性能和安全的解决方案&#xff0c;但两者的核心目标和技术实现存在显著差异。本文将从防御机制、技术架构、适用场景和代码实现等方面详细对比两者的区别&#xff0c;并提供可直接运行的代码示例。 一…...

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断 目录 故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断分类效果基本介绍模型描述DBO-BP-Bagging蜣螂算法优化多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目的与方法 二…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...