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

【jvm第7集】jvm调优工具(命令行工具)

文章目录

  • JVM 调优工具(命令行工具)
    • jps(Java Virtual Machine Process Status Tool)
    • jstat(JVM Statistics Monitoring Tool)
    • jmap(Memory Map Tool)
    • jstack(Thread Stack Tool)
    • jinfo(Java Configuration Info Tool)
    • jvisualvm(VisualVM)
  • 工具组合使用示例
    • 场景 1:定位内存泄漏
    • 场景 2:分析 CPU 高占用
    • 场景 3:优化 GC 配置
  • 注意事项

JVM 调优工具(命令行工具)

jps(Java Virtual Machine Process Status Tool)

  • 输入参数
参数说明
-l显示主类的完整路径或 JAR 文件名。
-q仅显示进程 ID(不显示主类名)。
-m显示传递给 main 方法的参数。
-v显示 JVM 启动参数(如 -Xmx-Xms)。
-V显示通过 .hotspotrc 文件传递的 JVM 参数。
  • 输出示例
# jps -l 输出示例
12345 /path/to/MyApplication.jar
67890 com.example.MyMainClass
  • 输出字段解释
    • 进程 ID:Java 进程的唯一标识符。
    • 主类名或 JAR 文件名:启动 Java 程序的主类或 JAR 包路径。
    • JVM 参数(当使用 -v 时):显示 -Xmx-Xms 等配置参数。

jstat(JVM Statistics Monitoring Tool)

  • 输入参数
参数说明
-class类加载/卸载统计(类数、占用空间、耗时)。
-gc显示 GC 堆行为(Eden、Survivor、Old Gen 的容量和使用量)。
-gcutil显示 GC 摘要信息(各区域使用百分比)。
-gccapacity显示各区域容量阈值(最小/最大容量)。
-gcnew显示新生代 GC 情况。
-gcold显示老年代 GC 情况。
-gccause显示最近一次 GC 的原因。
  • 输出示例
# jstat -gc <pid> 输出示例S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1024.0 1024.0  0.0    0.0   8192.0   2048.0   16384.0     4096.0   6144.0  1536.0  512.0   128.0     4      0.020     1      0.010    0.030
  • 输出字段解释
字段含义
S0C/S1CSurvivor 区总容量(KB)
S0U/S1USurvivor 区已使用容量(KB)
EC/EUEden 区总容量/已使用容量(KB)
OC/OU老年代总容量/已使用容量(KB)
MC/MU元空间总容量/已使用容量(KB)
CCSC/CCSU压缩类空间总容量/已使用容量(KB)
YGC/YGCT年轻代 GC 次数/总耗时(秒)
FGC/FGCTFull GC 次数/总耗时(秒)
GCT所有 GC 总耗时(秒)

jmap(Memory Map Tool)

  • 输入参数
参数说明
-heap显示堆内存详细配置(堆大小、GC 器类型)。
-histo显示堆中对象的直方图(对象数量、占用内存)。
-histo:live显示存活对象的直方图(触发 Full GC)。
-dump:format=b,file=<file>生成堆转储文件(二进制格式)。
-finalizerinfo显示等待终结的对象信息。
-clstats显示类加载器统计信息。
  • 输出示例
# jmap -histo <pid> 输出示例num     #instances         #bytes  class name
---------------------------------------------1:       1000000       80000000  [C2:        500000       40000000  java.lang.String3:        200000       20000000  [B
  • 输出字段解释
字段含义
num排名(按占用内存降序)
#instances对象实例数
#bytes对象占用内存(字节)
class name类名(如 [C 表示 char[]

jstack(Thread Stack Tool)

  • 输入参数
参数说明
-l显示锁信息(如持有的锁、等待的锁)。
-m显示混合模式堆栈(Java + Native 堆栈)。
-F强制生成线程转储(适用于无响应的进程)。
  • 输出示例
# jstack <pid> 输出示例
"main" #1 prio=5 os_prio=31 tid=0x00007f8e3c000000 nid=0x12345 runnable [0x0000700000000000]java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(SocketInputStream.java:152)at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)...
  • 输出字段解释
字段含义
线程名线程名称(如 main)。
状态线程状态(如 RUNNABLEBLOCKED)。
堆栈跟踪方法调用链,用于定位代码位置。
锁信息-l 参数)显示线程持有的锁或等待的锁。

jinfo(Java Configuration Info Tool)

  • 输入参数
参数说明
-flags显示所有 JVM 参数。
-flag <name>查看指定 JVM 参数的值。
-flag [+/-]<name>开启或关闭 JVM 参数。
-flag <name>=<value>设置 JVM 参数的值。
-sysprops显示系统属性(如 java.version)。
  • 输出示例
# jinfo -flags <pid> 输出示例
VM Flags:
-XX:CICompilerCount=4 
-XX:InitialHeapSize=536870912 
-XX:MaxHeapSize=1073741824 
-XX:+PrintCommandLineFlags 
...
  • 输出字段解释
    • JVM 参数:显示 -XX 参数的当前值(如 MaxHeapSize)。
    • 系统属性-sysprops):显示 java.versionos.name 等属性。

jvisualvm(VisualVM)

  • 输入参数

    • 图形化界面操作:无需命令行参数,通过界面选择目标进程或远程主机。
    • 远程连接配置:需在目标 JVM 启动时添加 JMX 参数(如 -Dcom.sun.management.jmxremote.port=8989)。
  • 输出内容

  1. 内存监控

    • 堆内存使用曲线(Eden、Survivor、Old Gen)。
    • 元空间(Metaspace)使用情况。
  2. 线程分析

    • 线程状态(RUNNABLE、BLOCKED 等)。
    • 线程堆栈跟踪(jstack 输出的图形化展示)。
    • 死锁检测(自动标记死锁线程)。
  3. GC 分析

    • GC 事件时间线(Minor GC、Full GC)。
    • GC 耗时统计(YGCT、FGCT)。
  4. 堆转储分析

    • 导入 .hprof 文件,显示对象分布。
    • Dominator Tree:定位内存泄漏对象。
  5. 性能调优

    • CPU 使用率监控。
    • 方法热点分析(采样或 Profiling)。

工具组合使用示例

场景 1:定位内存泄漏

  1. 输入jps -v 获取进程 ID。
  2. 输入jmap -dump:live,format=b,file=heapdump.hprof <pid> 生成堆转储。
  3. 输入jvisualvm 打开 heapdump.hprof
  4. 输出:通过 Dominator Tree 定位占用内存最高的对象。

场景 2:分析 CPU 高占用

  1. 输入top -H -p <pid> 查找高占用线程。
  2. 输入printf "%x\n" <tid> 转换线程 ID 为十六进制。
  3. 输入jstack <pid> | grep -A 20 <hex_tid> 定位线程堆栈。
  4. 输出:线程堆栈跟踪显示异常代码位置(如死循环)。

场景 3:优化 GC 配置

  1. 输入jstat -gc <pid> 1000 10 监控 GC 情况。
  2. 输入jinfo -flag +UseG1GC <pid> 启用 G1 GC。
  3. 输出:GC 频率和耗时下降,堆内存使用更均衡。

注意事项

  1. 生产环境使用限制

    • jmap -dump:生成堆转储可能导致 STW(Stop-The-World),建议通过 -XX:+HeapDumpOnOutOfMemoryError 自动触发。
    • jstack:频繁调用可能导致性能抖动,建议仅在问题排查时使用。
  2. 工具兼容性

    • jvisualvm:仅支持 HotSpot JVM。
    • jmap/jstack:需与目标 JVM 版本一致。
  3. 日志分析工具

    • GC Viewer:分析 jstat -gcutil 生成的日志。
    • MAT(Memory Analyzer):深度分析 .hprof 文件。
http://www.lryc.cn/news/2383378.html

相关文章:

  • react中运行 npm run dev 报错,提示vite.config.js出现错误 @esbuild/win32-x64
  • 鸿蒙UI开发——Builder与LocalBuilder对比
  • 关于光谱相机的灵敏度
  • Model 速通系列(一)nanoGPT
  • 微信小程序中,一个页面的数据改变了,怎么通知另一个页面也改变?
  • MySQL--day4--排序与分页
  • 自动化测试脚本点击运行后,打开Chrome很久??
  • iOS热更新技术要点与风险分析
  • 系统架构设计(十二):统一过程模型(RUP)
  • 系分论文《论软件系统安全分析和应用》
  • Mac安装redis
  • srs-7.0 支持obs推webrtc流
  • Babylon.js学习之路《七、用户交互:鼠标点击、拖拽与射线检测》
  • 星际争霸小程序:用Java实现策略模式的星际大战
  • 请问交换机和路由器的区别?vlan 和 VPN 是什么?
  • BERT 作为Transformer的Encoder 为什么采用可学习的位置编码
  • Python数据可视化高级实战之一——绘制GE矩阵图
  • StreamSaver实现大文件下载解决方案
  • 【Vue 3全栈实战】从响应式原理到企业级架构设计
  • Java线程池调优与实践经验
  • 【科研项目】大三保研人科研经历提升
  • 期刊采编系统安装升级错误
  • CSS【详解】弹性布局 flex
  • 自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models
  • React Flow 中 Minimap 与 Controls 组件使用指南:交互式小地图与视口控制定制(含代码示例)
  • 基于YOLOv8 的分类道路目标系统-PyTorch实现
  • STM32之串口通信WIFI上云
  • PCB智能报价系统——————仙盟创梦IDE
  • EXO分布式部署deepseek r1
  • 每日算法 -【Swift 算法】寻找两个有序数组的中位数(O(log(m+n)))详细讲解版