Java 监控、分析、管理工具整理(包括 jps、jmap、jstack、jstat、jConsole、VisualVM)

转载:https://blog.csdn.net/qingfanpeng/article/details/105015277

jps
用于列出java进程

jps -q
只输出进程ID,而不输出类的短名称
jps-v
可以显示传递给JVM的参数
jps -V
输出java进程的进程id和通过flag文件传入jvm的参数
jps -l
输出主函数的完整路径
jps -m
输出传递给Java进程(主函数)的参数
jmap(Memory Map)
作用
用来查看堆内存使用状况,一般结合jhat使用
检查一些严重影响性能的大对象的创建,检查系统中什么对象最多, 各种对象所占内存的大小等等
一般在java开发的项目启动时候,最好加上下面命令,在内存溢出的时候可以通过日志查看信息。 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/dump
主要参数
-heap
查看进程堆内存使用情况,包括使用的GC算法、 堆配置参数和各代中堆内存使用情况
-dump
生成 heapSnapshot
-histo
堆内存中的对象数目、大小统计直方图 等统计信息, 如果带上live则只统计活对象
因为在dump:live前会进行full gc, 如果带上live则只统计活对象, 因此不加live的堆大小要大于加live堆的大小
-F
当 -dump 没有响应时,强制生成堆快照
示例
jmap -histo 9440 > c:s.txt
PID为9440的Java应用程序的对象统计信息, 并输入到 s.txt 文件中
jmap -dump:format=b,file=test.dump
用jmap把进程内存使用情况dump到文件中

jinfo
作用
查看正在运行的Java运行程序的扩展参数, 甚至支持在运行时修改部分参数
Configuration info for java 虚拟机配置信息相关
在很多情况下,Java应用程序不会指定所有的JVM参数。 而此时,开发人员可能不知道某一个具体的JVM参数的默认值。 有了 jinfo 工具,开发人员可以很方便地找到JVM参数的当前值。
用法
-flag: 打印指定java虚拟机的参数值
-flag +< name >:设置指定java虚拟机参数的布尔值
-flag -< name >:取消指定java虚拟机参数的布尔值
-flag < name >=< value >:设置指定java虚拟机的参数的值
并不是所有的JVM参数都是可以改的, 通过java -XX:+PrintFlagsFinal -version | grep manageable查看哪些可改
示例
jinfo pid
前半段是系统的属性,后半段是jvm的参数
jinfo -flag PrintGCDetails pid
显示是否打印GC详细信息
jinfo -flag MaxTenuringThreshold pid
显示新生代对象晋升到老年代对象的最大年龄阈值(可配置)
jinfo -flag +PrintGCDetails pid
让 JCM打印GC详细信息

jstat
作用
JVM Statistics Monitoring Tool,
JVM统计监测工具
jstat - [-t] [-h] [] []
jstat -options 查看可用 options
-class:显示ClassLoader的相关信息。
-compiler:显示JIT编译的相关信息。
-gc:显示与GC相关的堆信息。
-gccapacity:显示各个代的容量及使用情况。 与-gc相比,它不仅输出了各个代的当前大小, 也包含了各个代的最大值和最小值
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因。
-gcnew:显示新生代信息。
-gcnewcapacity:显示新生代大小与使用情况。
-gcold:显示老年代与永久代的信息。
-gcoldcapacity:显示老年代的大小。
-gcmetacapacity:显示元空间的大小。(在java8之前是使用-gcpermcapacity显示永久代的大小)
-gcutil:显示垃圾收集信息。
-printcompilation:输出JIT编译的方法信息
示例
jstat -gc 21711 250 4
输出的是GC信息,采样时间间隔为250ms,采样数为4
jstat -class 21711 1000 2
输出java进程 21711 的ClassLoader相关信息。每秒钟统计一次信息,一共输出2次

jstack
作用
主要用来查看某个Java进程内的线程堆栈信息
系统崩溃了
如果java程序崩溃生成core文件,jstack工具可以用来获得 core文件的java stack和native stack的信息, 从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题
系统hung住
生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等
参数
-F :
当正常输出请求不被响应时,强制输出线程堆栈
-l :
除堆栈外,显示关于锁的附加信息
示例
jstack -l pid > jstack.log
搜索关键字“BLOCKED”,定位到引起死锁的地方
死循环需要配合Top命令一起使用, 死循环会导致CPU不断的飙升, 这时候使用top命令,查看cpu占用率较高的命令
使用top -H -p 217711 查看进程中具体是那一条线程的CPU利用率高, 找到 21742 线程
printf “%x ” 21742 得到 线程21742 的十六进制值为54ee
jstack 21711 | grep 54ee
输出进程 21711 的堆栈信息, 然后根据线程ID的十六进制值 grep,找出 54ee 线程

jstatd
一些监控工具也支持对远程计算机的监控(如:jps、jstat) 为了启用远程监控,则需要配合使用 jstatd(可以理解为 jstat deamon)工具

hprof
hprof不是独立的监控工具,它只是一个Java agent工具, 它可以用于监控Java应用程序在运行时的CPU信息和堆信息
使用hprof工具可以查看程序中各个函数的CPU占用时间占比
使用参数-agentlib:hprof=cpu=times,interval=10运行代码。 times选项将会在Java函数的调用前后记录函数的执行时间, 进而计算函数的执行时间

三大在线分析工具
https://gceasy.io/gc-index.jsp
https://fastthread.io/
https://heaphero.io/

可视化监控工具
JConsole
Java Monitoring and ManagementConsole
图形化 线程监控(可以理解为对应 jstack)、内存监控(对于 jmap)、类加载情况等
如果需要使用JConsole连接远程进程, 则需要在远程Java应用程序启动时加一些参数
VisualVM:
可以认为jvisualvm是jconsole的升级版
VisualVM基于NetBeans平台开发, 因此它一开始就具备了插件扩展的特性, 通过插件支持, VisualVM可以做许多事情:
显示虚拟机进程和进程的配置、环境信息(jps、jinfo)
监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)
dump及分析堆转储快照(jmap、jhat)
方法级的程序运行性能分析, 找出被调用最多、运行时间最长的方法
离线程序快照: 收集程序的运行时配置、线程dump、内存dump等信息建立一个快照, 可以将快照发送开发者处进行bug反馈等等
BTrace既可以作为visualVM的插件来使用, 也可以独立运行。 它能在不停止目标程序运行的前提下, 通过热部署技术加入原本并不存在的调试代码, 以实现对程序的动态调试, 如不需要重启服务,就可以新增日志
JMC
Java Mission Control
mat
MAT(Memory Analyzer Tool)工具是eclipse的一个插件(MAT也可以单独使用)
GCViewer
可视化分析 GC 日志
开启GC 日志
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./gc.log
三月 21, 2020. Created by XMind
————————————————
版权声明:本文为CSDN博主「qingfanpeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qingfanpeng/article/details/105015277

原文地址:https://www.cnblogs.com/libin2015/p/14451321.html