JVM 调优

ops/2025/3/16 8:32:55/

在生产环境中,JVM 调优是确保 Java 应用程序性能和稳定性的重要步骤。调优的目标通常是减少垃圾回收的时间、降低内存使用和提高应用程序的吞吐量。以下是一些常见的 JVM 调优策略和方法。

选择合适的垃圾收集器
-XX:+UseG1GC

调整堆内存大小,通过调整堆内存的大小,可以控制应用程序的性能
设置初始堆大小:-Xms512m
设置最大堆大小:-Xmx2048m
设置年轻代大小:-Xmn256m
一般推荐将初始堆和最大堆的比值设置为 1:2 或 1:3。

调整垃圾收集参数
设置新生代和老年代的比例:-XX:NewRatio=3 # 新生代与老年代的比例
设置 Survivor 区的大小:-XX:SurvivorRatio=8 # Eden 区与 Survivor 区的比例
设置最大 GC 停顿时间(对于 G1 GC):-XX:MaxGCPauseMillis=200

定期监控和分析 JVM 的运行状态,使用各种工具来观察性能和内存使用情况
JVisualVM:Java 自带的可视化监控工具,可以用来查看内存、线程、CPU 使用情况。
JConsole:用于监控 Java 应用的图形界面工具。
GC 日志:启用 GC 日志以分析垃圾收集的性能,-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log。
使用 Java Flight Recorder:这是一个强大的性能监控工具,可以提供深入的性能分析。

代码的优化可以显著减少内存使用和垃圾回收的压力
减少对象创建:尽量复用对象,避免频繁创建短命对象。
使用合适的数据结构:选择合适的集合类,例如 ArrayList vs LinkedList,并根据需求选择合适的实现。
避免内存泄漏:定期检查代码中是否存在内存泄漏,例如未清理的缓存、静态集合中的对象引用等。
设置线程数,在多线程应用中,合理配置线程数可以提高性能。
设置最大线程数(取决于应用和服务器的具体情况)。-XX:ParallelGCThreads=4 # 设置并行 GC 线程数`

使用 JDK 8 及之后的版本的特性
Metaspace:Java 8 之后,类元数据存储在本地内存中,避免了旧版本中永久代的限制。可以通过设置 Metaspace 大小来优化性能。-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
测试与迭代:调优是一个迭代过程。在生产环境中,测试是非常重要的步骤:
负载测试:在类似生产环境中进行负载测试,以观察系统在高负载情况下的表现。
逐步调整:每次只调整一个参数,观察性能变化,再进行下一步调整。

JVM调优后,主要需要观察以下性能指标,以确保优化达到了预期效果:

1. 内存使用情况

  • 堆内存(Heap Memory):观察堆内存的分配和使用情况,关注年轻代(Young Gen)、老年代(Old Gen)和永久代/元空间(PermGen/Metaspace)的使用是否稳定,是否存在频繁的Full GC。
  • 非堆内存(Non-Heap Memory):如Metaspace、Code Cache等,避免内存泄漏或过度消耗。
  • 直接内存(Direct Memory):如果使用了Netty、ByteBuffer等直接内存分配,需要监控sun.nio.MaxDirectMemorySize的使用情况,避免OutOfMemoryError。

2. GC(垃圾回收)情况

  • GC频率:年轻代(Minor GC)和老年代(Major/Full GC)的触发频率是否合理,避免过于频繁。
  • GC停顿时间:尤其是Full GC的停顿时间,是否影响业务请求的响应时间。
  • GC回收效率:查看每次GC回收的内存大小,判断是否有效。
  • GC日志分析:观察GC日志,确定GC策略是否合适(如G1、CMS、ZGC等),是否出现STW(Stop The World)过长的情况。

3. 线程与CPU使用

  • 线程数:监控JVM中的活跃线程数,是否存在线程泄漏或过度创建。
  • CPU使用率
    • 观察是否存在GC占用CPU过高的情况(如高并发应用可能导致CPU占用率过高)。
    • 分析是否有线程死锁、线程占用过多CPU的问题(可以使用jstack查看线程堆栈)。
  • 上下文切换:频繁的线程切换会影响性能,需要分析是否因锁竞争、GC等导致。

4. 吞吐量(TPS/QPS)

  • 吞吐量变化:调优前后TPS/QPS是否有提升,是否达到了预期优化目标。
  • 请求响应时间:如API接口的P99、P95、P50等响应时间是否有明显优化。
  • 系统吞吐瓶颈:分析是否因为GC、内存、线程池等导致吞吐量受限。

5. 类加载与元空间

  • 类加载次数:是否存在类加载过于频繁的问题,可能导致元空间(Metaspace)占用过高,触发Full GC。
  • 元空间大小:观察是否有元空间(Metaspace)溢出,可能需要调整-XX:MetaspaceSize

6. I/O性能

  • 磁盘I/O:如果应用涉及大量文件操作(如日志、缓存),需要观察I/O读写速度,避免GC导致I/O阻塞。
  • 网络I/O:如果涉及RPC调用(如Dubbo、gRPC)或数据库访问(如MySQL、Redis),需要分析调用延迟是否受JVM调优影响。

7. JVM指标监控工具

  • jstat:观察GC情况,如jstat -gcutil <pid> 1000
  • jstack:分析线程状态,查看是否有死锁。
  • jmap:分析堆内存使用情况,如jmap -heap <pid>
  • GC日志:结合-Xlog:gc*-verbose:gc分析GC情况。
  • 监控平台:使用Prometheus + Grafana、Arthas、JConsole、VisualVM等监控JVM性能。

总结

JVM调优后需要综合观察 内存、GC、CPU、吞吐量、线程、I/O等指标,并结合GC日志、JVM工具进行深入分析,确保优化有效果,并且不会引入新的问题。


http://www.ppmy.cn/ops/166163.html

相关文章

深度学习基础:线性代数的本质1——深入理解向量

目录 一、向量是什么 1. 从物理学角度 2. 从计算机专业角度 3. 从数学角度 4. 思考向量的特点方式 ① 向量是空间中的箭头 ② 向量是有序的数字列表 二、向量加法和向量相乘 1. 向量加法 2. 向量相乘 一、向量是什么 线性代数中最基础&#xff0c;最根源的组成部分。 …

Netty 连接存活检测——如何判断连接是否断开?

一.前言 最近碰到了一个需求&#xff0c;需要判断客户端与服务端之间的连接是否已经断开&#xff0c;查阅资料后发现Netty提供了如下几种方式&#xff0c;现总结如下&#xff0c;方便后续查看。 二.存活检测方式 2.1 SO_KEEPALIVE选项 Netty提供了SO_KEEPALIVE选项&#xf…

Milvus 中常见相似度度量方法

在 Milvus 中&#xff0c;相似度度量方法用于衡量向量之间的相似程度&#xff0c;不同的度量方法有不同的特点、优缺点和适用场景。以下是对 Milvus 中常见相似度度量方法的详细介绍以及对应的 search 参数示例。 1. 欧氏距离&#xff08;L2 Distance&#xff0c;L2&#xff0…

L3-1 夺宝大赛

输入样例 1&#xff1a; 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1&#xff1a; 7 6样例 1 说明&#xff1a; 七支队伍到达大本营的时间顺次为&#xff1a;7、不可能、5、3、3、5、6&#xff0c…

什么是大模型微调?

在大模型&#xff08;如GPT、BERT、LLaMA等&#xff09;广泛应用的今天&#xff0c;“微调”&#xff08;Fine-Tuning&#xff09;已成为释放模型潜力的关键技术。它通过针对特定任务调整预训练模型&#xff0c;使其从“通才”变为“专才”。本文将从概念、原理到实践&#xff…

MCU的工作原理:嵌入式系统的控制核心

MCU的工作原理可以概括为以下几个步骤&#xff1a; 1. 初始化 上电后&#xff0c;MCU从Flash存储器中加载程序代码&#xff0c;并初始化外设和寄存器。 2. 任务执行 根据程序逻辑&#xff0c;MCU执行数据处理、外设控制和通信等任务。通过中断系统实时响应外部事件。 3. 低…

深度揭秘:蓝耘 Maas 平台如何重塑深度学习格局

目录 前言 深度学习&#xff1a;技术基石与发展脉络 蓝耘 Maas 平台&#xff1a;深度学习的强大助推器 1. 高性能算力支撑 2. 丰富的模型支持 3. 便捷的开发体验 4. 完善的安全保障 代码示例&#xff1a;蓝耘 Maas 平台上的深度学习实践 1. 注册与登录 2. 代码实现 …

Html5记忆翻牌游戏开发经验分享

H5记忆翻牌游戏开发经验分享 这里写目录标题 H5记忆翻牌游戏开发经验分享前言项目概述技术要点解析1. 页面布局&#xff08;HTML CSS&#xff09;响应式设计 2. 翻牌动画效果3. 游戏逻辑实现状态管理卡片配对检测 开发技巧总结1. 模块化设计2. 性能优化3. 用户体验 踩坑经验扩…