目录:

  • 🧠 一、JVM调优目标
    • 1. 调优核心目标
    • 2. 调优常见问题
  • 🧩 二、JVM调优核心参数详解
    • 1. 堆内存相关参数
    • 2. 垃圾回收器相关参数
    • 3. GC日志与性能监控
    • 4. 元空间(Metaspace)调优
    • 5. 栈内存调优
    • 6. 其他关键参数
  • 📌 三、调优策略与最佳实践
    • 1. 堆内存调优
    • 2. 垃圾收集器选择
    • v3. GC日志分析
    • 4. OOM问题定位与解决
  • 🧱 四、JVM调优步骤与流程
    • 1. 调优流程
    • 2. 常用调优工具
    • 3. 调优常用命令
  • 📊 五、常见JVM调优场景与解决方案
    • 1. 频繁Full GC
    • 2. 内存泄漏
    • 3. 栈溢出(StackOverflowError)
    • 4. 元空间溢出(Metaspace OOM)
  • 🧪 六、常见JVM调优面试题及答案
    • 1. -Xms 和 -Xmx 的作用?
    • 2. -XX:NewRatio=2 和 -XX:SurvivorRatio=8 的含义?
    • 3. 如何选择合适的GC收集器?
    • 4. -XX:+PrintGCDetails 和 -Xloggc 的作用?
    • 5. 如何避免频繁Full GC?
    • 6. 如何分析GC日志?
    • 7. 如何定位内存泄漏?
  • ✅ 七、JVM调优核心知识点总结
  • 📋 八、完整JVM调优参数示例(生产环境推荐)**
  • 📄 九、完整GC日志示例(G1收集器)**
  • 📌 十、调优实践建议
  • 📚 十一、推荐学习资料
  • 📄 十二、完整代码示例(内存溢出场景)**
  • 📌 十三、JVM调优实战建议
  • ✅ 十四、总结:JVM调优核心知识点

🧠 一、JVM调优目标

1. 调优核心目标

目标说明
吞吐量(Throughput)单位时间内处理的任务数量(适合后台计算任务)。
停顿时间(Pause Time)每次GC暂停的时间(适合Web服务、低延迟场景)。
内存占用(Footprint)堆内存使用量(适合内存敏感场景)。

2. 调优常见问题

  • 内存泄漏(Memory Leak):对象不再使用但无法被GC回收。
  • 内存溢出(OutOfMemoryError):堆、栈、元空间等内存不足。
  • 频繁Full GC:老年代频繁触发Full GC,导致性能下降。
  • GC停顿过长:GC时间过长影响业务响应。

🧩 二、JVM调优核心参数详解

1. 堆内存相关参数

参数说明示例
-Xms初始堆大小(默认物理内存的1/64)-Xms512m
-Xmx最大堆大小(默认物理内存的1/4)-Xmx2g
-XX:NewSize新生代初始大小-XX:NewSize=256m
-XX:MaxNewSize新生代最大大小-XX:MaxNewSize=512m
-XX:NewRatio新生代与老年代比例(默认1:2)-XX:NewRatio=3(新生代占1/4)
-XX:SurvivorRatioEden与Survivor区比例(默认8:1:1)-XX:SurvivorRatio=4(Eden占80%)

2. 垃圾回收器相关参数

参数说明示例
-XX:+UseSerialGC使用串行垃圾收集器(单线程)-XX:+UseSerialGC
-XX:+UseParallelGC使用并行垃圾收集器(多线程,吞吐优先)-XX:+UseParallelGC
-XX:+UseConcMarkSweepGC使用CMS收集器(低延迟)-XX:+UseConcMarkSweepGC(JDK8~JDK13)
-XX:+UseG1GC使用G1收集器(大内存、低延迟)-XX:+UseG1GC(JDK9+ 默认)
-XX:MaxGCPauseMillisG1的目标停顿时间(默认200ms)-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSizeG1的Region大小(1~32MB)-XX:G1HeapRegionSize=4M

3. GC日志与性能监控

在这里插入图片描述

4. 元空间(Metaspace)调优

在这里插入图片描述

5. 栈内存调优

在这里插入图片描述

6. 其他关键参数

在这里插入图片描述

📌 三、调优策略与最佳实践

1. 堆内存调优

建议

  • 初始堆(-Xms)与最大堆(-Xmx)设为相同值,避免动态扩容开销。
  • 新生代占堆的1/3或1/4,老年代占2/3或3/4。
  • Eden区占新生代的80%(-XX:SurvivorRatio=8)。

示例

  • -Xms2g -Xmx2g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8

2. 垃圾收集器选择

在这里插入图片描述

v3. GC日志分析

日志示例:

2023-10-23T15:30:00.123+0800: [GC (Allocation Failure) [PSYoungGen: 131072K->15360K(157248K)] 131072K->15360K(503936K), 0.0123456 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]

关键指标

  • GC类型:Allocation Failure(分配失败触发GC)。
  • 内存变化:PSYoungGen: 131072K->15360K(新生代回收后内存占用)。
  • 总内存变化:131072K->15360K(503936K)(堆总内存变化)。
  • 耗时:0.0123456 secs(GC耗时)。

4. OOM问题定位与解决

在这里插入图片描述

🧱 四、JVM调优步骤与流程

1. 调优流程

  1. 确定目标:吞吐量、停顿时间、内存占用。
  2. 监控JVM状态:使用 jstat、VisualVM、JConsole。
  3. 分析GC日志:通过 -XX:+PrintGCDetails 定位问题。
  4. 调整参数:优化堆大小、GC收集器、元空间等。
  5. 验证效果:压测、监控、观察GC频率和停顿时间。

2. 常用调优工具

在这里插入图片描述

3. 调优常用命令

# 查看JVM参数
jinfo -flags <PID># 实时监控GC
jstat -gc <PID> 1000 10# 生成堆转储
jmap -dump:format=b,file=heap.bin <PID># 分析堆转储
jhat heap.bin

📊 五、常见JVM调优场景与解决方案

1. 频繁Full GC

原因

  • 老年代空间不足。
  • 大对象频繁创建。
  • 元空间内存不足。

解决方案

  • 增加堆大小(-Xmx)。
  • 调整新生代与老年代比例(-XX:NewRatio)。
  • 使用G1收集器(-XX:+UseG1GC)。

2. 内存泄漏

定位方法

  • 使用 jmap 生成堆转储(heap dump)。
  • 使用 MAT 分析内存泄漏对象。
  • 检查缓存、监听器、线程局部变量(ThreadLocal)。

解决方案

  • 释放无用对象(如缓存未清理)。
  • 避免静态集合类(如 static List)。
  • 使用弱引用(WeakHashMap)。

3. 栈溢出(StackOverflowError)

原因

  • 递归过深。
  • 线程栈大小不足(默认1MB)。

解决方案

  • 优化递归逻辑(改为迭代)。
  • 增加线程栈大小(-Xss2m)。
  • 避免线程数过多(优化线程池配置)。

4. 元空间溢出(Metaspace OOM)

原因

  • 类加载过多(如动态代理、JSP编译)。
  • 元空间配置过小。

解决方案

  • 增加元空间大小(-XX:MaxMetaspaceSize=256m)。
  • 优化类加载逻辑(避免重复加载)。
  • 使用 -XX:+PrintGCDetails 分析元空间占用。

🧪 六、常见JVM调优面试题及答案

1. -Xms 和 -Xmx 的作用?

答案

  • -Xms:JVM堆的初始大小。
  • -Xmx:JVM堆的最大大小。
  • 建议:将 -Xms 和 -Xmx 设置为相同值,避免动态扩容开销。

2. -XX:NewRatio=2 和 -XX:SurvivorRatio=8 的含义?

答案

  • -XX:NewRatio=2:新生代与老年代比例为1:2。
  • -XX:SurvivorRatio=8:Eden区与每个Survivor区比例为8:1:1。

3. 如何选择合适的GC收集器?

答案

  • 吞吐优先:Parallel Scavenge(-XX:+UseParallelGC)。
  • 低延迟:G1(-XX:+UseG1GC)。
  • 兼容性:CMS(JDK8~JDK13)。

4. -XX:+PrintGCDetails 和 -Xloggc 的作用?

答案

  • -XX:+PrintGCDetails:打印详细GC信息(如GC类型、内存变化)。
  • -Xloggc:/path/to/gc.log:将GC日志输出到指定文件。

5. 如何避免频繁Full GC?

答案

  • 增加堆大小(-Xmx)。
  • 避免大对象频繁创建。
  • 使用 -XX:+DisableExplicitGC 禁用 System.gc()。
  • 使用G1收集器(-XX:+UseG1GC)。

6. 如何分析GC日志?

答案

  • 使用 -XX:+PrintGCDetails 打印详细GC信息。
  • 使用 GCViewer、GCEasy 等工具分析日志。
  • 关注GC频率、停顿时间、内存变化趋势。

7. 如何定位内存泄漏?

答案

  • 使用 jmap -dump 生成堆转储。
  • 使用 MAT 分析堆转储,定位未释放对象。
  • 检查缓存、监听器、线程局部变量。

✅ 七、JVM调优核心知识点总结

模块	核心内容堆内存调优	-Xms、-Xmx、-XX:NewRatio、-XX:SurvivorRatioGC收集器	-XX:+UseG1GC、-XX:+UseParallelGC、-XX:+UseConcMarkSweepGCGC日志分析	-XX:+PrintGCDetails、-Xloggc、-XX:+PrintGCDateStamps元空间调优	-XX:MetaspaceSize、-XX:MaxMetaspaceSize栈调优	-Xss(线程栈大小)调优工具	jstat、jmap、jhat、VisualVM、MAT常见异常	OutOfMemoryError、StackOverflowError、GC overhead limit exceeded

📋 八、完整JVM调优参数示例(生产环境推荐)**

# 堆内存设置
-Xms2g -Xmx2g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8# G1收集器(JDK9+)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=4M# 元空间设置
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m# GC日志输出# 堆内存设置
-Xms2g -Xmx2g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8# G1收集器(JDK9+)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=4M# 元空间设置
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m# GC日志输出
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/myapp/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M# 性能优化
-XX:+UseTLAB -XX:+DisableExplicitGC -XX:+UseThreadPriorities# OOM处理
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/myapp/heapdump.hprof

📄 九、完整GC日志示例(G1收集器)**

2023-10-23T15:30:00.123+0800: [GC pause (G1

Evacuation Pause) (young), 0.0123456 secs][Parallel Time: 12.34 ms, GC Workers: 8][Eden: 1024.0M(1024.0M) Survivors: 128.0M->128.0M Heap: 1536.0M(2048.0M)][Times: user=0.05 sys=0.00, real=0.01 secs]

日志解析:

  • GC类型:G1 Evacuation Pause(G1的新生代GC)。
  • 耗时:0.0123456 secs(GC总耗时)。
  • 内存变化:Eden: 1024.0M→Survivors: 128.0M→Heap: 1536.0M(2048.0M)(堆内存使用情况)。

📌 十、调优实践建议

调优方向	建议堆大小	-Xms 和 -Xmx 设置相同,避免动态扩容开销。新生代比例	-XX:NewRatio=3(新生代占1/4)或 -XX:NewRatio=2(新生代占1/3)。GC日志	开启 -XX:+PrintGCDetails 和 -Xloggc,分析GC行为。G1调优	设置 -XX:MaxGCPauseMillis=200,调整 -XX:G1HeapRegionSize。元空间	设置 -XX:MaxMetaspaceSize=256m,避免元空间OOM。类加载冲突	使用 -XX:+TraceClassLoading 和 -XX:+TraceClassUnloading 跟踪类加载。

📚 十一、推荐学习资料

  • 《深入理解 Java 虚拟机》(周志明)
  • 《Java 性能调优指南》
  • JVM 官方文档:https://docs.oracle.com/en/java/javase/17/gctuning/
  • GC日志分析工具:GCViewer、GCEasy、GCPlot
  • JVM调优视频教程(B站、慕课网、CSDN)

📄 十二、完整代码示例(内存溢出场景)**

1. 堆内存溢出(Java Heap OOM)
public class HeapOOM {public static void main(String[] args) {List<byte[]> list = new ArrayList<>();while (true) {list.add(new byte[1024 * 1024]); // 每次分配1MB}}
}
2. 元空间溢出(Metaspace OOM)
public class MetaspaceOOM {public static void main(String[] args) {while (true) {// 使用 CGLIB 动态生成类Enhancer enhancer = new Enhancer();enhancer.setSuperclass(MetaspaceOOM.class);enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> proxy.invokeSuper(obj, args1));enhancer.create(); // 持续创建新类,导致元空间溢出}}
}

📌 十三、JVM调优实战建议

在这里插入图片描述

✅ 十四、总结:JVM调优核心知识点

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95915.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95915.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95915.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树

HOT100–Day13–104. 二叉树的最大深度&#xff0c;226. 翻转二叉树&#xff0c;101. 对称二叉树 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;二叉树。 关键&#xff1a;要深刻理解《递归》 104. 二叉树的最大深度 方法&#xff1a;递归 思路&…

Maven 从 0 到 1:安装、配置与依赖管理一站式指南

Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南一、Maven 是什么&#xff1f;二、核心概念&#xff1a;POM三、Maven 是如何工作的&#xff1f;—— 仓库机制四、安装Maven五、在 IntelliJ IDEA 里配置…

k8s,v1.30.4,安装使用docker

一.前置概念Docker 与 Kubernetes 共用同一个 containerd 进程 时&#xff0c;只要满足以下 3 个条件&#xff0c;就不会冲突&#xff1a;检查点要求原因cgroup-driverkubelet 与 containerd 必须同为 systemd二者不一致会导致 Pod 无法调度Unix socketkubelet 指向 /run/conta…

开源AI智能名片链动2+1模式S2B2C商城小程序服务提升复购率和转介绍率的研究

摘要&#xff1a;本文聚焦于开源AI智能名片链动21模式S2B2C商城小程序在提升客户复购率和转介绍率方面的作用。服务对于促进客户复购和转介绍的重要性不言而喻&#xff0c;维护老客户的成本远低于开发新客户&#xff0c;微商通过推出各项服务来赢得客户忠诚。本文深入探讨开源A…

[数据结构] ArrayList(顺序表)与LinkedList(链表)

目录 1.List 1.1 什么是List 1.2 常用的方法 1.3 List的使用 2. 线性表 3. ArrayList 类(顺序表) 3.1 顺序表定义 3.2 ArrayList链表的功能模拟实现 3.3 ArrayList简介 3.4 ArrayList的构造方法 3.5 ArrayList的遍历 3.5 ArrayList的具体使用实例 3.5.1 杨辉三角 …

Hive使用Tez引擎出现OOM的解决方法

环境是Hive以Tez作为引擎&#xff0c;然后使用客户端&#xff08;比如DataGrip&#xff09;连接Hive运行SQL查询&#xff0c;运行过程中报错信息如下&#xff1a;java.lang.OutOfMemoryError: Java heap space…连接工具以DataGrip为例&#xff0c;解决办法如下&#xff1a; --…

SQL面试题及详细答案150道(81-100) --- 子查询篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 81. 什么是子查询?子查…

笔记:ubuntu安装matlab

记录一下ubuntu安装matlab的过程 一、进入桌面 虽然系统是ubuntu server&#xff0c;但是安装matlab最好还是有桌面。这里使用todesk等工具&#xff0c;进入桌面进行远程安装。 二、创建matlab账号 由于学校已经提供了matlab的账号&#xff0c;只需要用自己的学生邮箱进行注册即…

CentOS 7 编译安装 OpenSSL 3.4.2

CentOS 7默认已经安装了OpenSSL&#xff0c;不过版本比较低 openssl version结果为&#xff1a;OpenSSL 1.0.2k-fips 26 Jan 2017 已经无法满足需求 OpenSSL 源码下载链接&#xff1a;https://www.openssl-library.org/source/ 下载源码包为&#xff1a;https://github.com…

python advance -----object-oriented

alt shift 上下键&#xff0c;行代码上下移动0

具身智能的工程落地:视频-控制闭环的实践路径

引言&#xff1a;从“能算会说”到“会看能做” 具身智能真正的门槛&#xff0c;不在于把模型做得更大&#xff0c;而在于把感知—决策—执行焊成一条低时延、稳态可控的闭环工程链路&#xff1a;从相机/麦克风采集&#xff0c;到编解码与传输&#xff0c;再到边/端推理、指令…

STM32 - Embedded IDE - GCC - 如何在工程中定义一段 NoInit RAM 内存

导言如上所示&#xff0c;Keil创建一段NoInit内存同样是通过图形界面来完成&#xff0c;IRAM2的起始地址0x2000000&#xff0c;大小8bytes。NoInit的意思是程序初始化时&#xff0c;不会将内存清0初始化。如上所示&#xff0c;在MEMORY段&#xff0c;将64K的RAM内存划一块8byte…

MyBatisX代码生成插件在IDEA中的安装配置、连接数据库表生成代码快速开发示例

场景 MyBatisX插件介绍 MybatisX是一款基于IDEA的快速开发插件&#xff0c;由MyBatis-Plus团队开发维护&#xff0c;为效率而生。 它的主要功能如下&#xff1a; 支持mapper.xml和Mapper接口之间方法的互相导航跳转&#xff1b; 内置代码生成器&#xff0c;通过使用GUI的形…

单词分析与助记之数据建表(以production为例)

单词分析与助记数据建表&#xff08;以production为例&#xff09;&#xff1a; id&#xff08;流水号&#xff09;&#xff1a;词形&#xff1a;production配图1-标题&#xff1a;略配图1-地址&#xff1a;略配图2-标题&#xff1a;略配图2-地址&#xff1a;略配图3-标题&…

AI助力决策:告别生活与工作中的纠结,明析抉择引领明智选择

在日常生活与工作中&#xff0c;我们时常会面临各种纠结的决策。从选择一份新工作、创业方向&#xff0c;到决定是否要搬家、换车&#xff0c;每一个决策都可能对我们的未来产生深远影响。然而&#xff0c;面对复杂多变的信息和不确定的未来&#xff0c;如何做出明智的选择成为…

--定位--

GPSRTK GPS组成 GPS分为三部分。 空间星座部分&#xff1a;由至少24颗卫星组成&#xff08;目前有30多颗在轨运行&#xff09;&#xff0c;分布在6个中地球轨道上。保证全球任何地方、任何时间至少能接收到4颗以上的卫星信号。每颗卫星不断播发一种包含卫星星历​&#xff0…

音转文模型对比FunASR与Faster_whisper

FunASR简介 FunASR是由阿里巴巴达摩院开源的语音识别工具包&#xff0c;提供包括语音识别&#xff08;ASR&#xff09;、语音活动检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离及多说话人ASR等多种功能。FunASR工具包支持工业级语音识别模型的…

uniapp阿里云验证码使用

在 UniApp 中使用阿里云验证码插件&#xff08;aliyun-captcha&#xff09;需要完成微信小程序端的插件配置和项目内的组件使用两个主要步骤&#xff0c;以下是详细流程&#xff1a; 一、微信公众平台配置插件&#xff08;必须&#xff09; 获取插件 AppID 阿里云验证码插件的…

基于开源AI大模型AI智能名片S2B2C商城小程序的情感营销策略研究

摘要&#xff1a;本文聚焦于开源AI大模型AI智能名片S2B2C商城小程序这一新兴商业工具&#xff0c;探讨情感在其营销中的核心地位。情感在营销里是需突出表现的关键要素&#xff0c;价值观与极致化生活方式均是对情感的阐释。在开源AI大模型AI智能名片S2B2C商城小程序的背景下&a…

警惕!你和ChatGPT的对话,可能正在制造分布式妄想

2021年圣诞节&#xff0c;19岁的英籍印度裔男子 贾斯旺辛格柴尔 &#xff08;Jaswant Singh Chail&#xff09;带着一把十字弩闯入温莎城堡&#xff0c;声称要 刺杀英国女王 &#xff0c;为英国历史上的暴行复仇。 这场荒谬的刺杀注定以失败告终。被捕后&#xff0c;他自称是一…