虚拟机性能监控
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度
jps显示虚拟机进程
可以看到打开的Liuma程序虚拟机进程为9808。
选项
jstat 虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程[插图]虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jstat -gc 9808 250 20
每250毫秒查询一次进程9808 垃圾收集状况,一共查询20次
选项
jstat -gcutil 9808
S0S1:表示两个survivor区
E:表示新生代eden区用的空间占比4.6%
O:表示老年代使用空间9.35%
M:元空间metaspace占比用户存储元数据和静态变量的空间占比。
CCS:压缩类空间,是元空间的补充,用户存放其他类加载器加载的类。
YGC:程序运行以来发生minor GC 8次 总耗时0.075秒
FGC:发生Full GC 0次
GCT:所有GC总耗时0.075
M为96.2说明了什么?
在jstat -gcutil的输出中,M代表元空间(Metaspace)的使用率。这个值是百分比,所以M为96.92意味着元空间的使用率为96.92%。元空间用于存储类的元数据和静态变量,当类被加载到JVM中时,会在元空间中为其分配内存。如果元空间的使用率过高,可能意味着有很多类被加载到JVM中,并且可能接近或已经耗尽了元空间的容量。这可能会导致类加载失败或系统性能下降。通常,如果元空间的使用率超过80%,就需要考虑增加元空间的容量,以防止内存溢出。
jinfo:Java配置信息工具
实时地查看和调整虚拟机各项参数
jinfo命令格式:
jinfo [option] pid
-flag可以查看某一个配置的值
jinfo -flag InitialHeapSize 480
\jre1.8\bin>jinfo -flag InitialHeapSize 480
-XX:InitialHeapSize=268435456
jmap:Java内存映像工具
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)
jmap [ option ] vmid
选项
jmap是Java虚拟机(JVM)的一个命令行工具,用于生成堆转储(Heap Dump)文件,也就是Java应用程序在运行时使用的内存的快照。这个快照可以用来分析内存使用情况,找出内存泄漏等问题。
使用jmap生成堆转储快照的基本命令格式如下:
bash
jmap -dump:format=b,file=<heap-dump-path> <process-id>
其中:
<heap-dump-path> 是你希望保存堆转储文件的路径和文件名。
<process-id> 是你需要转储的Java进程的ID。
例如,如果你想要为进程ID为12345的Java应用生成堆转储,并且希望将文件保存在/tmp/heapdump.hprof,那么你可以使用以下命令:
jmap -dump:format=b,file=/tmp/heapdump.hprof 12345
执行完这个命令后,jmap就会为指定的Java进程生成一个堆转储文件。
可以看到已经生成dump文件
jhat:虚拟机堆转储快照分析工具
除非手上真的没有别的工具可用,否则一般都不会去直接使用jhat命令来分析dump文件
VisualVM,以及专业用于分析dump文件的Eclipse Memory Analyzer、IBM HeapAnalyzer[插图]等工具,都能实现比jhat更强大更专业的分析功能
\jre1.8\bin>jhat /Projects/heapdump.hprof
Reading from /Projects/heapdump.hprof...
Dump file created Mon Sep 25 17:12:05 CST 2023
Snapshot read, resolving...
Resolving 870410 objects...
Chasing references, expect 174 dots..............................................................................................................................................................................
Eliminating duplicate references..............................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
屏幕显示“Server is ready.”的提示后,用户在浏览器中键入http://localhost:7000/就可以看到分析结果
jstack:Java堆栈跟踪工具
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack [option] vmid
JDK可视化工具
JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsole和VisualVM
jconsole
通过JDK/bin目录下的“jconsole.exe”启动JConsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户自己再使用jps来查询 ,如果连接失败,可能jdk版本与程序版本不对应
“内存”页签相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势
“线程”页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析
VisualVM:多合一故障处理工具
找到jvisualvm.exe运行
生成、浏览堆转储快照
也可以点击文件-装入加载dump文件
Profiler页签可以分析程序性能
先选择“CPU”和“内存”按钮中的一个,然后切换到应用程序中对程序进行操作,VisualVM会记录到这段时间中应用程序执行过的方法。如果是CPU分析,将会统计每个方法的执行次数、执行耗时;如果是内存分析,则会统计每个方法关联的对象数以及这些对象所占的空间。
linux端
找不到jps命令,因为虚拟机未安装openjdk-devel
Linux 虚拟机jps命令找不到 - 知乎
yum install java-1.8.0-openjdk-devel.x86_64
解决
本文内容摘自《深入理解java虚拟机:JVM高级特性与最佳实践》