jdk自带工具
命令行工具
Jps
功能描述:
jps是用于查看有权访问的hotspot虚拟机的进程。当未指定hostid时,默认查看本机jvm进程,否则查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。jps可以列出jvm进程lvmid、主类类名、main函数参数、jvm参数、jar名称等信息。
命令用法:
jps [options] [hostid]
主要选项:
没添加option的时候,默认列出VM标示符号和简单的class或jar名称.
-q:仅输出VM标识符,不包括classname、jar name、arguments in main method
-m:输出main method的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
Jstat
功能描述:
它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
命令用法:
jstat -
Jinfo
功能描述:
jinfo的作用是实时查看和调整虚拟机各项参数。(特别可以查看未指定的默认参数)
命令用法:
jinfo [ option ] pid
主要选项:
-flags 打印虚拟机的flags参数
无option参数 打印虚拟机的flags参数和系统属性
Jmap
功能描述:
jmap命令用于生成堆转储快照(一般称为heapdump或dump文件),jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
命令用法:
jmap [ option ] vmid
主要选项:
-histo[:live] 打印堆的柱状图
-dump:[live,]format=b,file=
-heap 打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和generation wise heap usage。jdk9及以上版本使用jmap -heap pid命令查看当前heap使用情况时,发现报错,提示需要使用jhsdb jmap来替代
Jhat
jhat命令将dump出来的hprof文件转成html的形式,然后通过http访问可以查看堆情况,功能较为简陋,Jhat在jdk11中已删除,可以用jvisualVm代替。
Jstack
功能描述:
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
命令用法:
jstack [ option ] vmid
主要选项:
-l 打印锁的额外信息
-e 打印线程的额外信息
线程中参数解释:
tid: Java memory address of its internal Thread control structure.16进制的
nid: native thread id. 每一个nid对应于linux下的一个tid, 即lwp (light weight process, or thread).16进制的,转到10进制后可以用ps命令找到它。
prio: java内定义的线程的优先级
os_prio:操作系统级别的优先级
cpu为cpu运行时间
elapsed为实际运行时间
daemon说明是守护线程
Jcmd
功能描述:
多种jdk命令工具的集合
命令用法:
jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
主要选项:
Thread.print 类似于jstack,打印线程快照
GC.heap_info 打印堆内存信息
此外还有很多其他选项,可以通过help查看每个命令的说明
Jhsdb
功能描述:
jstack 、jmap、jinfo、jsnap等工具的集合
命令用法:
类似jstack 、jmap、jinfo、jsnap
主要选项:
可以通过help查看
命令行工具小结
java进程信息查看:jps
java类加载、内存、垃圾收集、即时编译等运行时数据信息查看:jstat
java虚拟机参数信息查看:jinfo
java堆信息查看:jmap、jhsdb
java栈信息查看:jstack、jhsdb
命令行工具集合工具:jhsdb、jcmd
可视化工具
Jconsole
功能介绍:
Jconsole是一个基于JMX的java GUI监视工具,可以以图表化的形式显示各种数据,并可通过远程连接监视远程的服务器VM。可以监控内存、线程、类加载、jmx等。
使用方法:
命令行里打 jconsole,选择进程就可以了。
Linux上的JConsole有时无法使用,需要用本地的JConsole,此时linux 启动项目时,需要添加参数。
java
-Djava.rmi.server.hostname=ip #远程服务器ip,即本机ip
-Dcom.sun.management.jmxremote #允许JMX远程调用
-Dcom.sun.management.jmxremote.port=xxx #自定义jmx 端口号
-Dcom.sun.management.jmxremote.ssl=false # 是否需要ssl 安全连接方式
-Dcom.sun.management.jmxremote.authenticate=false #是否需要秘钥
-jar test.jar
本地启动jconsole后选择远程进程并填写ip和上面指定的jmx端口,开启远程监控。
JvisualVm
VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,是功能最强大的运行监控和故障处理程序之一,曾经很长一段时间是oracle官方主力发展的虚拟机故障处理工具。功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。在内存分析上,Java VisualVM的最大好处是可通过安装Visual GC插件来分析GC(Gabage Collection)趋势、内存消耗详细状况。在高版本JDK(大于1.8或后期更新的1.8版本)中已经不会再自动集成 VisualVM,需要独立下载。
第三方工具
Eclipse MAT
功能介绍:
MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,可以生成各种内存检查报告,它可以帮助我们查找内存泄漏和减少内存消耗。
Arthas
功能介绍:
Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,提供 Tab 自动不全,可以方便的定位和诊断线上程序运行问题。
GCeasy
GCeasy是一个线上GC分析工具,基于jvm输出的GC日志产生GC报告。
Prometheus
在springboot服务中引入依赖,引入io.micrometer和springboot actuator相关依赖,然后再prometheus中修改配置接入参数,最后再grafana上导入数据源,通过“jvm-micrometer_rev9”模板查看jvm参数即可
结论
Jvm诊断工具使用建议:
性能诊断与调优:Arthas可以随产品布设于测试和生产环境,随时开启进行性能诊断。
可视化监控:开发环境可以利用jconsole或者jvisualVM实时可视化监控远程进程,测试和生产环境可以使用Prometheus+grafana,实现JVM的可视化监控和问题追溯。
Heap dump分析:利用Eclipse MAT进行Heap dump分析可以生成各类内存分析报告;
GC日志分析:基于GC日志,可以利用线上工具GCeasy生成GC报告。