jcmd的简单总结

jcmd,简单,总结 · 浏览次数 : 220

小编点评

**jcmd 简要介绍** jcmd 是 Java 虚拟机命令行工具,可以用于管理和监控 Java 进程。它可以收集和分析 Java 进程的信息,包括运行时间、内存使用、垃圾回收状况等。 **主要功能** * 列出运行的 Java 进程信息 * 获取类加载器信息 * 获取内存使用情况 * 显示垃圾回收状况 * 查看线程信息 * 监控性能指标 **使用步骤** 1. 设置 JVM 命令行参数 `PATH`,以指定 Java 编译器路径。 2. 运行 `jcmd` 命令。 **常用命令** * `jcmd | grep caf-boot | head -n 1 | awk '{print $1}'`:显示运行的 `caf-boot` 类的类加载器信息。 * `jcmd | grep caf-boot | head -n 1 | awk '{print $1}'`:显示运行的 Java 进程的内存使用情况。 * `jcmd | grep caf-boot | head -n 1 | awk '{print $1}'`:显示运行的 Java 进程的垃圾回收状况。 **其他说明** * `-XX:+UnlockDiagnosticVMOptionsGC.class_histogram`:开启诊断模式,显示类加载器统计图。 * `GC.heap_info`:获取堆区信息。 * `GC.heap_dump`:将堆区信息导出为 CSV 文件。

正文

jcmd的简单总结


背景

自从2019年公司转向java技术路线.
一直断断续续的在学习java相关的技术内容.
但是总感觉学的不是很深入.
这周比较累.也不想在学新东西了. 所以想着再总结一下jcmd相关的内容. 
希望能够记住相关命令, 不需要在每次都百度

简要说明

jcmd等命令操作时需要能够attach到具体的具体的jvm的进程上面
所以建议使用与jvm运行的进程相同的java版本进行信息采集. 
成功的概率更高一些. 
建议可以讲运行时的java bin路径设置到 PATH环境变量中.便于快速进行相关命令操作
类似于:
export PATH=$PATH:/path/to/your/java/bin

展示进程

jcmd
会展示所有在运行的java进程,以及主类的目录
比如获取当前服务器的一个进程信息: 
jcmd |grep caf-boot|head -n 1 |awk '{print $1}'

查看帮助

jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` help 

展示结果为:
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` help 
24567:
The following commands are available:
VM.native_memory
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help <command>'.

部分命令解释-VM

VM.xxxx
这个参数主要是获取java虚拟机的部分信息, 就类似于Windows的系统属性的相关内容. 
获取的信息是静态信息. 可以查看系统的部分配置如堆区大小等. 可以对系统有一个简要的判断. 
VM.native_memory
需要在启动脚本中添加部分配置 才可以进行展示, 之前讲述过不在过多描述.
VM.classloader_stats
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'`  VM.classloader_stats
可以通过如下命令检查查看 类加载器的信息
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` VM.classloader_stats  |awk '{print $7}' |sort |uniq -c |sort -k1h
其他VM相关的命令
VM.uptime  启动时间
VM.dynlibs 启动加班的相关jar以及动态链接库等
VM.flags   查看启动的配置信息. 
VM.system_properties  查看时区,版本,脚本语言字符集等.
VM.command_line  启动脚本等信息
VM.version       启动的jdk版本等信息

部分命令解释-GC

GC.xxx
主要是获取java进程运行时的垃圾回收的情况. 
可以用于分析环境的异常情况.  
需要注意类似的命令都会展示 安全点, 会STW影响系统的响应.

GC.class_stats
需要开启部分参数
GC.class_stats command requires -XX:+UnlockDiagnosticVMOptions

GC.class_histogram
直方图
可以使用如下命令存储
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'`  GC.class_histogram  > zhaobsh.class_histogram   

GC.heap_info
堆区信息
如果查看经常 99%的老年代和新年代 有可能的问题是:
1. 内存泄露
2. 内存不够
3. 分配不均
4. 创建大内存对象,没有直接升级到老年代. 

GC.heap_dump
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'`  GC.heap_dump  /root/zhaobsh202303051941.dump
可以直接抓取dump文件
感觉应该是最简单的命令了. 
跟jmap 等命令比起来要简单很多. 
注意如果文件名不带路径的话可能会到 jcmd 挂载的进程的workdirectory里面去形成.

部分命令解释-thread

Thread.print
可以查看具体堆信息
可以通过
top -Hp `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` -bn 1 里面的CPU使用与
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` Thread.print 进行对照
发现有异常的堆栈信息.

部分命令解释-PerfCounter.print

很奇怪的是帮助里面没有 
PerfCounter.print
但是这个可以显示部分性能信息. 并且非常全面详实
但是里面我不太了解对象的单位信息. 
可以看到 创建的线程数量等信息. 以及最高值等. 

java.threads.daemon=48
java.threads.live=302
java.threads.livePeak=350
java.threads.started=2371
具体的情况需要在学习和研究一下. 

与jcmd的简单总结相似的内容:

jcmd的简单总结

jcmd的简单总结 背景 自从2019年公司转向java技术路线. 一直断断续续的在学习java相关的技术内容. 但是总感觉学的不是很深入. 这周比较累.也不想在学新东西了. 所以想着再总结一下jcmd相关的内容. 希望能够记住相关命令, 不需要在每次都百度 简要说明 jcmd等命令操作时需要能够a

jcmd的简要分析命令

# jcmd的简要分析命令 ## 背景 ``` 端午加班一整天. 回到家同事让他们抓取一下堆栈信息好进行分析 连上VPN后就进行了一下处理. 自己简单看了下堆栈的总数等信息. 同事使用工具进行了分析. 我这边其实下过很多工具,但是都荒废了 就想,自己这些时间一直学习shell, 可以手工写一个简单分

[转帖] JVM诊断命令jcmd介绍

https://www.cnblogs.com/codelogs/p/16535451.html 简介# 从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、jinfo等,并且jdk添加新的诊断功能,也会通过jcmd提供

[转帖] JVM诊断命令jcmd介绍

https://www.cnblogs.com/codelogs/p/16535451.html 简介# 从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、jinfo等,并且jdk添加新的诊断功能,也会通过jcmd提供

[转帖] JVM诊断命令jcmd介绍

https://www.cnblogs.com/codelogs/p/16535451.html 简介# 从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、jinfo等,并且jdk添加新的诊断功能,也会通过jcmd提供

[转帖] JVM诊断命令jcmd介绍

https://www.cnblogs.com/codelogs/p/16535451.html 简介# 从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、jinfo等,并且jdk添加新的诊断功能,也会通过jcmd提供

[转帖] JVM诊断命令jcmd介绍

https://www.cnblogs.com/codelogs/p/16535451.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jst

[转帖]查看docker中运行的JVM参数问题及解决方法

方法一、jcmd命令: 1、jps获取java的线程id 2、jcmd pidVM.flags获取 51152:-XX:CICompilerCount=3 -XX:InitialHeapSize=526385152 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=

[转帖]jcmd命令详解

1 基本知识 jcmd 是在 JDK1.7 以后,新增了一个命令行工具。 jcmd 是一个多功能的工具,相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计、JFR、内存使用、垃圾收集、线程堆栈、JVM 运行时间,也可以手动执行 GC、导出(TODO 能导出线程信息?)线程

[转帖]jcmd命令详解

1 基本知识 jcmd 是在 JDK1.7 以后,新增了一个命令行工具。 jcmd 是一个多功能的工具,相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计、JFR、内存使用、垃圾收集、线程堆栈、JVM 运行时间,也可以手动执行 GC、导出(TODO 能导出线程信息?)线程