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

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第五章整理

第五章 调优案例分析与实战:

JVM 调优案例速查表(基于第5章)

问题现象工具/证据可能原因优化措施
大内存机器 GC 停顿严重GC 日志、jstat、JFR单 JVM 超大堆,Full GC 停顿过长拆分为多 JVM、小堆集群;合理分配堆/DirectMemory/缓存
集群同步触发 OOM堆 Dump、监控内存曲线全量同步、大对象反序列化、缓存无控制分页/分批同步;异步队列;缓存限额;Protobuf/Kryo 序列化
堆外内存 OOMNMT、系统监控、hs_err_pid.logDirectByteBuffer/Netty/Unsafe 内存泄漏调整 -XX:MaxDirectMemorySize;Netty 正确释放内存;检查本机内存
调用外部命令系统变慢线程 Dump、strace/lsofRuntime.exec 阻塞 IO;进程切换开销大异步消费 stdout/stderr;用 Java API 替代外部命令
JVM 崩溃(Crash)hs_err_pid.log、core dump、JIT 日志JNI 本地方法 Bug;JIT Bug;宿主机资源不足检查本地库;禁用可疑 JIT 优化;升级 JDK;限制进程内存
内存占用过大(数据结构不当)堆 Dump、jmap -histoHashMap/LinkedList 大量膨胀;装箱/拆箱过多使用基本类型集合库;设置合理初始容量;减少装箱拆箱
Windows 下长时间停顿操作系统日志、性能监控系统虚拟内存分页导致 JVM 停顿关闭 Windows 页面文件;限制 JVM 物理内存
安全点导致长时间 STWjstack、JFR Safepoint 事件长循环无检查点;native 方法阻塞优化循环插入检查点;减少长时间 native 调用;升级 JDK
Eclipse 启动慢类加载时间统计、GC 日志类加载慢、反射多、CDS 未启用启用 CDS;减少反射;升级 JDK 模块化
Eclipse 运行卡顿GC 日志、jstat、JFRGC 频繁,堆配置不合理调整 -Xmx;合理配置 Eden/Survivor 比例;选择 CMS/G1
交互响应延迟大JFR、GC 日志ParallelGC 吞吐量优先,停顿时间长使用 CMS/G1 收集器;优化停顿分布
吞吐量不足TPS 监控、GC 日志收集器选择不当、频繁 GC增加堆大小;用 ParallelGC 提高吞吐;减少 Full GC 触发条件

📌 统一 SOP 建议

  1. 收集证据(GC 日志、堆 Dump、线程快照、hs_err_pid.log)。
  2. 定位原因(堆/堆外/线程/OS)。
  3. 制定措施(参数优化、GC 策略、代码重构、架构调整)。
  4. 验证效果(压测对比、灰度上线)。
  5. 固化经验(形成工单模版/知识库)。

5.1 概述:JVM 调优理念

Q1:JVM 调优的核心思路是什么?
A:,基于证据(日志、监控、Dump),先定位瓶颈,再通过参数优化、收集器选择或代码改造解决。

Q2:JVM 调优常见目标有哪些?
A:① 吞吐量最大化;② 响应延迟最小化;③ 内存占用合理;④ 稳定性提升。


5.2 案例分析

5.2.1 大内存硬件上的程序部署策略

Q3:为什么大内存机器不能盲目给 JVM 配置超大堆?
A:大堆会导致 GC 停顿时间大幅增加,业务响应中断时间更长。

Q4:应对大内存机器的合理做法是什么?
A:分堆策略(堆+缓存+DirectMemory)、服务拆分、多 JVM 实例分摊压力。


5.2.2 集群间同步导致 OOM

Q5:集群同步场景中常见的内存溢出原因?
A:全量同步、大对象反序列化、缓存未限流。

Q6:优化手段有哪些?
A:分页/分批同步、异步队列、缓存限额、高效序列化(如 Protobuf)。


5.2.3 堆外内存导致溢出

Q7:哪些场景容易出现堆外内存溢出?
A:NIO DirectByteBuffer、Netty、Unsafe 内存分配。

Q8:如何诊断堆外 OOM?
A:检查 -XX:MaxDirectMemorySize 配置,开启 Native Memory Tracking (NMT)


5.2.4 外部命令导致系统缓慢

Q9:为什么 Runtime.exec 调用外部命令可能让系统变慢?
A:外部进程 IO 未被消费导致阻塞;进程切换开销大。

Q10:正确做法是什么?
A:异步读取 stdout/stderr,避免阻塞;能用 Java API 的尽量用 Java。


5.2.5 服务器虚拟机进程崩溃

Q11:导致 JVM 进程崩溃的常见原因?
A:JNI 本地方法 Bug、JIT Bug、宿主机内存不足。

Q12:排查 JVM 崩溃的关键证据?
A:hs_err_pid.log、core dump 文件、JIT 编译日志。


5.2.6 不恰当数据结构导致内存占用过大

Q13:数据结构使用不当的例子?
A:HashMap 保存海量小对象、LinkedList 频繁增删导致 Node 膨胀。

Q14:如何优化数据结构内存占用?
A:使用基本类型集合库(Trove/fastutil)、预估容量、避免装箱拆箱。


5.2.7 Windows 虚拟内存导致长时间停顿

Q15:为什么 Windows 平台会出现长时间停顿?
A:系统页面文件触发虚拟内存换页,导致 JVM 停顿。

Q16:如何避免?
A:关闭页面文件或限制 JVM 最大物理内存占用。


5.2.8 安全点导致长时间停顿

Q17:Safepoint 是什么?
A:JVM 在特定位置挂起所有线程,用于执行 GC、类重定义、栈信息收集等。

Q18:为什么会导致长时间停顿?
A:某些线程长时间不进入 Safepoint(如死循环、native 方法),阻塞全局停顿。

Q19:优化方式有哪些?
A:减少无检查点的长循环,避免长时间 native 调用,升级 JDK。


5.3 实战:Eclipse 调优

Q20:调优前的第一步是什么?
A:采集基准数据(GC 日志、类加载时间、线程数、CPU 占用)。

Q21:升级 JDK 带来的双刃剑效应?
A:性能更好,但可能引入 API/兼容性问题。

Q22:如何优化类加载时间?
A:启用 Class Data Sharing (CDS)、模块化 JDK、减少反射使用。

Q23:如何通过内存设置降低 GC 频率?
A:调整 -Xmx,合理配置 Eden/Survivor 比例,依据 GC 日志调优。

Q24:如何选择收集器降低延迟?
A:交互型应用选 CMS/G1,批处理型应用选 ParallelGC。


5.4 小结

Q25:JVM 调优的标准化流程是什么?
A:① 收集证据 → ② 复现问题 → ③ 参数/代码调优 → ④ 压测验证 → ⑤ 固化经验。

Q26:调优时,如何避免“拍脑袋式改参”?
A:必须基于监控数据和对比实验,而非经验或猜测。


这样一来,26 道问答题 覆盖了第5章全部知识点(概述、案例、Eclipse 实战、小结),不会遗漏重点,同时避免了为了凑数而重复。

要不要我再把这些 问答题整理成表格形式(像工单速查表:问题现象 → 工具证据 → 可能原因 → 优化措施),这样就能直接当运维/调优手册用了?

http://www.dtcms.com/a/346609.html

相关文章:

  • Python爬虫实战:研究WSL技术,构建跨平台数据采集和分析系统
  • 攻防世界—Confusion1—(模板注入ssti)
  • IPsec
  • selenium采集数据怎么应对反爬机制?
  • C++算法·进制转换
  • 2025/8/23c++++++++
  • kafaka知识要点
  • Spring Boot 3为何强制要求Java 17?
  • 【modbus】数据采集系统
  • 微服务概述1
  • Elasticsearch Ruby 客户端 Bulk Scroll Helpers 实战指南
  • 【Redis 进阶】----主从复制(重点理解流程和原理)
  • 【Tech Arch】Apache Flume海量日志采集的高速公路
  • 如何在 Spring Boot 中安全读取账号密码等
  • SpringBoot3整合dubbo3客户端【最佳实践】
  • 【204页PPT】某著名企业信息化规划方案(附下载方式)
  • 沟通效率提升 - 智能写作与邮件处理
  • 集成电路学习:什么是CNN卷积神经网络
  • 浏览器解析网址的过程
  • MiniOB环境部署开发(使用开源学堂)
  • 【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、三维瓦片地球)第九期
  • 达梦数据库巡检常用SQL(二)
  • Flutter BLoC 全面入门与实战(含代码示例)
  • C#--- 锁总结
  • 在SAP Query中添加双击事件
  • 【CSP初赛】程序阅读3
  • 通过官方文档详解Ultralytics YOLO 开源工程-熟练使用 YOLO11实现分割、分类、旋转框检测和姿势估计(附测试代码)
  • 54 C++ 现代C++编程艺术3-移动构造函数
  • 园区节能减碳大屏可视化设计指南
  • SpringBoot 快速上手:从环境搭建到 HelloWorld 实战