Jcmd 虚拟机诊断利器

news2024/9/21 21:52:57

Jcmd 虚拟机诊断利器

Java虚拟机(JVM)是运行Java程序的抽象化的计算器。今天,来学习下如何轻松诊断正在运行的JVM。

JDK本身中提供了许多可用的工具,可以用于各种开发、监视和故障排除活动。推荐使用jcmd,简单易懂,可以提供关于JVM运行的各种信息。此外,jcmd是JDK7以后的一个推荐工具,用于增强JVM诊断,性能开销低。

是什么

JVMCommand 简称jcmd, 是JDK自带的一个向JVM发送诊断命令请求的小工具,免费使用,位于${JAVA_HOME}/bin目录下。但是,它必须在运行JVM的同一台机器上使用。不能向其它工具提供远程诊断的功能,如 Jconsole。接下来看看如何在诊断JVM。

获取PID

在排查问题时,通常情况下,开发者/运维人员需要知道Java程序对用的PID,然后分析PID占用的资源情况。如IO、内存、CPU、线程状态等等。但是前提是:找到PID。JDK 或 linux系统提供了很多种方式给开发者排查正在运行的JVM(PID)

  • jps - Java Virtual Machine Process Status Tool, 访问主机JAVA进程的工具

    AndydeMacBook-Pro:bin andy$ jps
    82800 Jps
    80180 Launcher
    

    jps 命令不带参数时,只显示PID、主类名

    # 只显示pid
    jps -q
    # 显示pid、类名及相关参数
    jps -m
    # 显示pid、运行参数
    jps -v
    
  • ps - 是linux提供的一个强大的工具,一般根据关键字进行过滤

    ps -ef | grep java
    

    在这里插入图片描述

    以上的信息太过复杂,使用awk工具做筛选过滤

    ps -ef | grep java |  awk '{print $2}'
    
  • jcmd - 哈哈 今日主角登场,使用该命令,列出所有正在运行的JVM进程

    在这里插入图片描述

    类似 jps -m 命令的效果

获取进程参数选项

可以使用jcmd pid help 命令获取指定PID的参数选项列表,不同版本的JVM结果列表略有不同

AndydeMacBook-Pro:bin andy$ jcmd 80180 help
80180:
The following commands are available:
Compiler.CodeHeap_Analytics
Compiler.codecache
Compiler.codelist
Compiler.directives_add
Compiler.directives_clear
Compiler.directives_print
Compiler.directives_remove
Compiler.queue
GC.class_histogram
GC.finalizer_info
GC.heap_dump
GC.heap_info
GC.run
GC.run_finalization
JFR.check
JFR.configure
JFR.dump
JFR.start
JFR.stop
JVMTI.agent_load
JVMTI.data_dump
ManagementAgent.start
ManagementAgent.start_local
ManagementAgent.status
ManagementAgent.stop
Thread.print
VM.cds
VM.class_hierarchy
VM.classloader_stats
VM.classloaders
VM.command_line
VM.dynlibs
VM.events
VM.flags
VM.info
VM.log
VM.metaspace
VM.native_memory
VM.print_touched_methods
VM.set_flag
VM.stringtable
VM.symboltable
VM.system_properties
VM.systemdictionary
VM.uptime
VM.version
help

jcmd 常用选项

上述罗列的参数选项非常的多,不做一一介绍。来学习下工作中经常使用的参数选项。

VM.version

AndydeMacBook-Pro:bin andy$ jcmd 80180 VM.version
80180:
Java HotSpot(TM) 64-Bit Server VM version 17.0.5+9-LTS-191
JDK 17.0.5

获取JVM的基本信息

VM.system_properties

获取JVM运行的系统参数,由于篇幅过长,做了一些删减

AndydeMacBook-Pro:bin andy$ jcmd 80180 VM.system_properties
80180:
#Tue Dec 06 10:36:15 CST 2022
http.proxyHost=127.0.0.1
java.specification.version=17
sun.jnu.encoding=UTF-8
java.class.path=/Applications/IntelliJ IDEA CE.app/Contents/plugins/java/lib/jps-launcher.jar
https.proxyPort=50154
java.vm.vendor=Oracle Corporation
jdt.compiler.useSingleThread=true
sun.arch.data.model=64
kotlin.incremental.compilation=true
kotlin.daemon.client.alive.path="/var/folders/z8/4hs2q4zx73q6zfg2myh6m_kh0000gn/T/kotlin-idea-7350919135759315545-is-running"
java.vendor.url=https\://java.oracle.com/
user.timezone=Asia/Shanghai
...

VM.flags

输出所有使用的VM参数,这些参数要么由开发指定,要么由JVM默认使用:

AndydeMacBook-Pro:bin andy$ jcmd 80180 VM.flags
80180:
-XX:CICompilerCount=4 -XX:ConcGCThreads=2 -XX:G1ConcRefinementThreads=8 -XX:G1EagerReclaimRemSetThreshold=8 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=134217728 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=734003200 -XX:MaxNewSize=440401920 -XX:MinHeapDeltaBytes=1048576 -XX:MinHeapSize=8388608 -XX:NonNMethodCodeHeapSize=5839372 -XX:NonProfiledCodeHeapSize=122909434 -XX:ProfiledCodeHeapSize=122909434 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:SoftMaxHeapSize=734003200 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC -XX:-UseNUMA -XX:-UseNUMAInterleaving 

类似的,其他命令(VM.command_line, VM.uptime, VM.dynlibs) 也提供了其他一些非常有用的属性和基本信息,不做一一演示了。

Thread.print

之前介绍的指令都是介绍JVM的各种基本参数。现在来看一下跟线程相关的指令,这对JVM故障排除非常有帮助。Thread.print命令用于打印所有运行线程的堆栈信息,获取线程状态。

AndydeMacBook-Pro:bin andy$ jcmd 80180 Thread.print
80180:
2022-12-07 06:45:22
Full thread dump Java HotSpot(TM) 64-Bit Server VM (17.0.5+9-LTS-191 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007fa2446ab370, length=13, elements={
0x00007fa244818000, 0x00007fa24481a800, 0x00007fa245092e00, 0x00007fa245812600,
0x00007fa24580ec00, 0x00007fa245811200, 0x00007fa245811800, 0x00007fa245811e00,
0x00007fa244819200, 0x00007fa24501d800, 0x00007fa245813400, 0x00007fa244803800,
0x00007fa2458d7e00
}

"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.96ms elapsed=10406.56s tid=0x00007fa244818000 nid=0x4203 waiting on condition  [0x00007000076ef000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.ref.Reference.waitForReferencePendingList(java.base@17.0.5/Native Method)
	at java.lang.ref.Reference.processPendingReferences(java.base@17.0.5/Reference.java:253)
	at java.lang.ref.Reference$ReferenceHandler.run(java.base@17.0.5/Reference.java:215)

"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.51ms elapsed=10406.56s tid=0x00007fa24481a800 nid=0x4503 in Object.wait()  [0x00007000077f2000]
   java.lang.Thread.State: WAITING (on object monitor)
 ...

GC.class_histogram

该参数输出JVM 堆使用情况的相关信息。需要注意的是,她将列出所有实例的信息(包含外部类或应用程序类)

AndydeMacBook-Pro:bin andy$ jcmd 80180 GC.class_histogram
80180:
 num     #instances         #bytes  class name (module)
-------------------------------------------------------
   1:         25312        4789808  [B (java.base@17.0.5)
   2:         24623         590952  java.lang.String (java.base@17.0.5)
   3:          1676         531360  [I (java.base@17.0.5)
   4:          4206         508080  java.lang.Class (java.base@17.0.5)
   5:         11604         371328  java.util.concurrent.ConcurrentHashMap$Node (java.base@17.0.5)
   6:          3726         356904  [Ljava.lang.Object; (java.base@17.0.5)
   7:          5806         185792  java.util.HashMap$Node (java.base@17.0.5)
   8:          6847         109552  java.lang.Object (java.base@17.0.5)
...

GC.heap_dump

故障排查时,通常需要将堆栈信息导出为dump文件,以便开发人员做事后问题分析、定位。跟jmap dump -pid 一样 GC.heap_dump 命令可以导出dump文件

AndydeMacBook-Pro:Downloads andy$ jcmd 80180 GC.heap_dump ./demo_heap_dump
80180:
Dumping heap to ./demo_heap_dump ...
Heap dump file created [15855508 bytes in 0.246 secs]

JFR

Jcmd 使用JFR来分析应用程序性能。JFR(或Java Flight Recorder)是一个内置于JDK中的评测和事件收集框架。JFR允许我们收集有关JVM和Java应用程序行为的详细低级信息。

AndydeMacBook-Pro:Downloads andy$ jcmd 80180 JFR.start name=demo_recording settings=profile delay=10s duration=20s filename=./demorecording.jfr
80180:
Recording 1 scheduled to start in 10 s. The result will be written to:

/Users/andy/Library/Caches/JetBrains/IdeaIC2022.2/compile-server/demorecording.jfr

VM.native_memory

该选项可以提供关于JVM上的堆和非堆内存的许多有用细节信息。因此,对于可以用于调整内存使用情况并检测任何内存泄漏。JVM内存可粗略的分为堆内存和非堆内存。该命令可以获得完整JVM内存使用情况的详细信息。此外,这在定义基于容器的应用程序的内存大小时非常有用。

AndydeMacBook-Pro:Downloads andy$ jcmd 80180 VM.native_memory
80180:
Native Memory Tracking:

Total: reserved=1159598KB, committed=657786KB
-                 Java Heap (reserved=524288KB, committed=524288KB)
                            (mmap: reserved=524288KB, committed=524288KB) 
 
-                     Class (reserved=279652KB, committed=29460KB)
                            (classes #6425)

内存泄露检测

特定情况下,需要识别JVM中是否存在内存泄露。首先需要定义一个时间基线,然后监控一段时间,以了解内存是否持续增加。因此内存泄露检测需要分两部

AndydeMacBook-Pro:Downloads andy$ jcmd 80180 VM.native_memory baseline
80180:
Baseline succeeded
AndydeMacBook-Pro:Downloads andy$ jcmd 80180 VM.native_memory summary.diff
80180:
Native Memory Tracking:

Total: reserved=1162150KB +2540KB, committed=660930KB +3068KB

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计南通大学福利发放管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

ThinkPHP6综合业务管理系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP6综合业务管理系统一 介绍 综合业务管理系统基于ThinkPHP6开发,数据库mysql,前端Layui,后台模板ok-admin。管理员登录系统后可对场所,分类,用户,运营商&am…

图片扫描仪第一弹,我实现了一个办公位简笔画

来一波对比 其实我工位还有点手办,一个植物,实在不会画,于是画了个基础版的。 办公位简笔画 虽然,这个工位上没有一个动画,但是图形和实物神似,所以可以用另一个动总结这个简笔画,那就是生动…

量子计算(十一):常见逻辑门以及含义

文章目录 常见逻辑门以及含义 一、Hadamard(H)门 二、Pauli-X 门 三、Pauli-Y 门 四、Pauli-Z 门 五、旋转门(rotation operators) 1、RX(θ)门 2、RY(θ)门 3、RZ&#xf…

深入理解计算机系统

hi,大家好,我是大师兄,让我们一起复习了一遍计算机系统核心知识,希望大家早日掌握这些核心知识,打造自己坚实的基础,为自己目标慢慢积累,等到自己春天的到来。详细点击查看-> 极客星球。计算…

PDF解除密码怎么操作?教你一键解除密码

我们在处理工作文件时,经常会有一些文件是加密状态的,这种文件必须要输入密码才可以打开,这时候就造成了很多不便,如果文件需要打印,我们就必须先输入密码,而且在每次查看文件前,都必须输入密码…

记录一次 在linux 搭建的mysql迁移到docker容器中

上篇文章写道,我腾讯云被攻击了,然后我各种删除木马文件,但在这个过程中,有些系统文件没认到,以为是木马文件,就删除了,各种处理无果,打开腾讯云的救援模式,备份了些重要…

【数据库】mysql索引

DB索引: 如果表创建了索引,那么DB会维护一张关于索引和主键关系的表 好处:快速查找数据 缺点:要额外维护一张表,会额外占用空间,对于表数据的更新操作都涉及更新索引 索引的操作 创建索引:…

LeetCode 74. 搜索二维矩阵

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 74. 搜索二维矩阵,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode 74.…

[Android] [ROOT] Magisk(魔术师/面具) 设置以及必装模块的安装

🍁简介 当我们给手机刷入Magisk(面具)后,等于获得了安卓系统的最高管理员权限,也就是root权限。获取root权限后的设备相对于未root的设备,安全性会有一定的降低。也许是基于这个原因,现在大部分应用都会检测你的设备是…

xcode常用功能与操作

查看target是静态还是动态库 选中target,点击Build Settings tag,然后再右上角搜索框输入 mach,查看Mach-O type的值即可 mach-o文件类型分为: Executable:应用的主要二进制 Dylib Library:动态链接库&am…

栈与队列5:逆波兰表达式求值

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:150. 逆波兰表达式求值 题目: 根据 逆波兰表示法,求表达式的值。 有效的算符包括 、-、*、…

安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】

💕💕💕💕💕💕💕💕💕💕💕提取手机分区方法列举💕💕💕💕💕💕💕&a…

mybatis-plus,sgg,杨bochao,p49完成

MyBatis-Plus (baomidou.com) 一 MyBatis-Plus简介 增强工具。只做增强不做改。 可以直接在mybatis的基础上整合mybatis-plus。此时并不会影响mybatis的功能,即mybatis原来的功能都在,该怎么用还怎么用。锦上添花的是还能使用mybatis-plus提供的&#…

修改node_modules中安装的依赖(如第三方ui组件样式)并在下次安装时保留

场景:需要修改安装的某个ui库的样式或者其他依赖,直接去node_modules中修改后,重新安装,或者其他小伙伴的电脑上并不能同时修改 方案:用patch-package 可以保留修改 步骤一 安装 patch-package —> npm i patch-…

jQuery - 获取内容和属性

jQuery 拥有可操作 HTML 元素和属性的强大方法。 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力。 jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变得很容易。 DOM Document Object Model(文档对象模型&a…

OpenGL 图像白平衡色温

目录 一.OpenGL 图像白平衡色温 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 图像白平衡色温 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenG…

MySQL小知识:为何从8.0开始取消了MySQL查询缓存

前言 缓存是对系统性能优化的重要手段。但是有经验的DBA都建议生产环境中把MySQL Query Cache关闭。MySQL8.0更是直接取消了查询缓存。 一键获取MySQL核心数据结构、底层实现原理、索引、事务、锁机制、MySQL性能优化案例、美团MySQL中间件等。 这是为什么?查询缓…

[附源码]Python计算机毕业设计Django微信点餐系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

HTTP的请求方式有哪些?

文章目录HTTP的请求方式1. GET方法2. HEAD方法3. POST方法4. PUT方法5. DELETE方法6. CONNECT方法7. OPTIONS方法8. TRACE方法HTTP的请求方式 在 HTTP/1.1 中提供了一系列方法以便我们向服务器发送不同类型的请求,需要注意的是这些方法名称都是区分大小写的&#xf…