01
jps
Jps:Lists the instrumented Java Virtual Machines (JVMs) on the target system. This command is experimental and unsupported.(列出目标系统上插入指令的Java虚拟机(JVM)。此命令是实验性的,不受支持。)
用法:
jps [ options ] [ hostid ] //hostid不填默认本机
Option:
-q:抑制传递给main方法的类名、JAR文件名和参数的输出,只生成一个列表本地JVM标识符。
-m: 显示传递给主方法的参数。对于嵌入式JVM,输出可能为空。
-l: 显示应用程序主类的完整包名或应用程序JAR文件的完整路径名。
-v: 显示传递给JVM的参数。
实战演练:
jps -l
02
Jstat
jstat:Monitors Java Virtual Machine (JVM) statistics. This command is experimental and unsupported.(监视Java虚拟机(JVM)统计信息。此命令是实验性的,不受支持。)
用法:
jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]
Option:
实战案例
jstat -gc 85703 5000 1000
-class:类加载统计
-compiler:Java HotSpot VM及时编译统计
-gccapacity:内存池生成和空间容量。
-gccause:此选项显示与-gcutil选项相同的垃圾收集统计信息摘要,但包括上一个垃圾收集事件和(如果适用)当前垃圾收集事件。除了柱子此选项为-gcutil列出,它将添加以下列。
-gcnew:新一代统计。
-gcnewcapacity:新生代空间统计。
-gcold:老年代和元空间行为统计。
-gcoldcapacity:老年代空间统计。
-gcmetacapacity:Metaspace空间统计。
-gcutil:垃圾收集统计信息摘要。
-printcompilation:Java HotSpot VM编译方法统计。
03
jmap
jmap:Prints shared object memory maps or heap memory details for a process, core file, or remote debug server. This command is experimental and unsupported.(打印进程、核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。此命令是实验性的,不受支持。)
用法:
jmap [ options ] pid
Option:
-dump:[live,] format=b, file=filename
将hprof二进制格式的Java堆转储到filename。live子选项是可选的,但是在指定时,只有
堆中的活动对象被转储。要浏览堆转储,可以使用jhat(1)命令读取生成的文件。
-finalizerinfo
打印有关正在等待完成的对象的信息。
-heap
打印所使用的垃圾回收、头部配置和各代堆使用情况的堆摘要。在此外,还打印了内部字符串的数量和大小。
-histo[:live]
打印堆的柱状图。对于每个Java类,对象的数量、内存大小(以字节为单位)以及将打印限定类名。JVM内部类名以星号(*)前缀打印。如果现场指定子选项,则只计算活动对象。
-clstats
打印Java堆的类装入器统计信息。对于每个类装入器,它的名称、活动程度、地址、父级
类加载器,以及它所加载的类的数量和大小被打印出来。
扩展
用mat工具分析内存溢出情况
导入后选择Histogram
堆中java类会从大到小排列
选中你要查看的类,点击右键选择List Objects-->with incoming references
可以看出gc root的调用链,定位问题出处。当然也要结合实际情况灵活运用。
04
jstack
打印Java进程、核心文件或远程调试服务器的Java线程堆栈跟踪。这个命令是实验性的不受支持。
用法:
jstack [ options ] pid
Option:
-l 长名单。打印有关锁的其他信息,例如拥有的java.util.concurrent可拥有同步器。
-m 打印一个混合模式堆栈跟踪,既有java也有本地C/C++框架。
-h 打印堆信息。
实战演练
利用jstack排查线上cpu利用率飙升的问题:
先利用top -H -p pid查看应用进程下的所有线程情况,找出占用资源最高的线程
这里只是只是演示排查步骤,并不表示利用率很高。
最前面的pid是线程id(85802),将其转换成16进制,
printf "%x" 85802
14f2a
然后根据jstack -l 85802 | grep -C 5 14f2a找出这个线程栈信息