jps
jps(JVM Process Status Tool)是虚拟机进程状况工具。它的功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。
如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就必须依赖jps命令显示主类的功能才能区分了。
jps -l
8 /home/app.jar
1067 sun.tools.jps.Jps
jstat
jstat(JVM Statistics Monitoring Tool)是虚拟机统计信息监视工具。用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工具。
jps
6 app.jar
4879 Jps
jstat -class 6
Loaded Bytes Unloaded Bytes Time
32921 57261.6 743 914.1 131.51
Loaded:加载类的数量
Bytes:加载类的size,单位为Byte
Unloaded:卸载类的数目
Bytes:卸载类的size,单位为Byte
Time:加载与卸载类花费的时间
jstat -gcutil 7
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
2.94 0.00 5.23 26.43 93.36 91.29 46 6.674 0 0.000 6.674
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
M:元数据区已使用的占当前容量百分比
CCS:压缩类空间已使用的占当前容量百分比
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
其他操作参考文章:jvm 性能调优工具之 jstat 命令详解
jinfo
jinfo(Configuration Info for Java)Java配置信息工具。作用是实时查看和调整虚拟机各项参数。jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值, 甚至可以在运行时修改部分参数,并使之立即生效。 但是,并非所有参数都支持动态修改。参数只有被标记 manageable的flag可以被实时修改。其实,这个修改能力是极其有限的。
jinfo -flags 8
Attaching to process ID 8, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=526385152 -XX:MaxHeapSize=4194304000 -XX:MaxNewSize=1397751808 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=175112192 -XX:OldSize=351272960 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line: -javaagent:/home/agent/ttl/transmittable-thread-local-2.11.5.jar -javaagent:/home/agent/vts/vts-agent.jar -javaagent:/home/agent/sw/skywalking-agent.jar -Ddisconf.conf_server_host=XXX -Xmx4000m -Duser.timezone=Asia/Shanghai
注意一:
info -sysprops pid (openjdk1.8版本无法使用,有bug,会报异常:Caused by: java.lang.InternalError: Metadata does not appear to be polymorphic,oraclejdk无此问题)
注意二
docker运行的 Tomcat 容器,由于jvm 内存溢出,想要排查,进入到容器内,都无法使用相关命令,如 jmap、jps、jinfo 等命令,都会报出 Can’t attach to the process: ptrace(PTRACE_ATTACH, …) failed for 1: Operation not permitted 这个问题。
Docker 自 1.10 版本开始加入的安全特性。 jmap 这类 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而 Docker 自 1.10 版本开始,默认的 seccomp 配置文件中禁用了 ptrace。
解决方案:运行容器时加入对应设置,使容器支持相关命令的使用–cap-add=SYS_PTRACE
jmap
jmap(Memory Map for Java)Java内存映像工具。用于生成堆转储快照(一般称为heapdump或dump文件)。jmap还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
如果不使用jmap命令,要想获取Java堆转储快照也还有一些比较“暴力”的手段:-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件,又或者在Linux系统下通过Kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。
使用jmap生成dump文件
jmap -dump:format=b,file=heapdump.hprof 19692
Dumping heap to D:\xxx\heapdump.hprof ...
Heap dump file created
其他操作参考文章:jvm 性能调优工具之 jmap
jhat
jhat(JVM Heap Analysis Tool)虚拟机堆转储快照分析工具。可以与jmap搭配使用,来分析jmap生成的堆转储快照。
jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。用到的不多。
主要原因有两个方面:
1,是一般不会在部署应用程序的服务器上直接分析堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器上进行分析,因为分析工作是一个耗时而且极为耗费硬件资源的过程,既然都要在其他机器上进行,就没有必要再受命令行工具的限制了。
2,是jhat的分析功能相对来说比较简陋
jhat heapdump.hprof
Reading from heapdump.hprof...
Dump file created Mon Aug 29 15:11:26 CST 2022
Snapshot read, resolving...
Resolving 2417136 objects...
Chasing references, expect 483 dots...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Eliminating duplicate references...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
用户在浏览器中输入http://localhost:7000/可以看到分析结果
jstack
jstack(Stack Trace for Java)Java堆栈跟踪工具。用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
Dump 文件分析关注重点
runnable,线程处于执行中
deadlock,死锁(重点关注)
blocked,线程被阻塞 (重点关注)
Parked,停止
locked,对象加锁
waiting,线程正在等待
waiting to lock 等待上锁
Object.wait(),对象等待中
waiting for monitor entry 等待获取监视器(重点关注)
Waiting on condition,等待资源(重点关注),最常见的情况是线程在等待网络的读写
其他操作参考文章:jstack命令解析
JDK中除了附带大量的命令行工具外,还提供了几个功能集成度更高的可视化工具,用户可以使用这些可视化工具以更加便捷的方式进行进程故障诊断和调试工作。这类工具主要包括JConsole、JHSDB、VisualVM和JMC四个。
VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。Oracle曾在VisualVM的软件说明中写上了“All-in-One”的字样,预示着它除了常规的运行监视、故障处理外,还将提供其他方面的能力,譬如性能分析(Profiling)。
VisualVM的性能分析功能比起JProfiler、YourKit等专业且收费的Profiling工具都不遑多让。
而且相比这些第三方工具,VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性的影响也较小,使得它可以直接应用在生产环境中。这个优点是JProfiler、YourKit等工具无法与之媲美的。
VisualVM基于NetBeans平台开发工具,所以一开始它就具备了通过插件扩展功能的能力,有了插件扩展支持,VisualVM可以做到:
·显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
·监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)。
·dump以及分析堆转储快照(jmap、jhat)。
·方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
·离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
公司的监控采用的是Prometheus+Grafana。可以很方便的看到服务的资源使用,线程相应耗时。JVM内存使用,GC情况
具体可参考文章:Spring Boot Actuator、Prometheus、Grafana
网友评论