jps
jps(Java Virtual Machine Process Status Tool)是JDK提供的一个可以列出正在运行的Java虚拟机的进程信息的命令行工具,它可以显示Java虚拟机进程的执行主类(Main Class,main()函数所在的类)名称、本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)等信息。另外,jps命令只能显示它有访问权限的Java进程的信息。
命令参数说明:
-q:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
-mlvV:我们可以指定这些参数的任意组合。
-m:显示Java虚拟机启动时传递给main()方法的参数。
-l:显示主类的完整包名,如果进程执行的是JAR文件,也会显示JAR文件的完整路径。
-v:显示Java虚拟机启动时传递的JVM参数。
-V:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
hostid:指定的远程主机,可以是ip地址和域名, 也可以指定具体协议,端口。如果不指定,则显示本机的Java虚拟机的进程信息。
-help:显示jps命令的帮助信息。
jstat
jstat 是JDK中提供的一个命令行工具,主要用来打印JVM 性能数据相关的统计数据。主要包含以下几个方面:
垃圾回收(GC)方面数据
编译(Compilation)相关数据
类加载信息(Class Loader)
jstat 使用很简单,只要在命令行中执行如下命令:
jstat -gc -t 11256 10000 10
参数解释:
-gc :打印相关的统计参数
-t: 在每行日志之前加上JVM的启动时间
11256 : 目标Java进程的ID
10000: jstat命令执行间隔时间(milliseconds),10000表示每10s打印一行日志
10: jstat命令的执行次数,(和上面的时间间隔一起,表示jstat会每10s执行1次,总共执行10次).
参数意义:
- time : JVM启动时间(单位为秒)
- S0C :年轻代中S0区的容量 (字节)
- S1C :年轻代中S1区的容量 (字节)
- S0U :年轻代中S0区目前已使用空间 (字节)
- S1U :年轻代中S1区目前已使用空间 (字节)
- EC :年轻代中Eden区的容量 (字节)
- EU :年轻代中Eden区目前已使用空间 (字节)
- OC :老年代的容量 (字节)
- OU :老年代目前已使用空间 (字节)
- YGC :从应用程序启动到采样时年轻代中GC次数
- YGCT :从应用程序启动到采样时年轻代中GC所用时间(s)
- FGC :从应用程序启动到采样时老年代(全GC)GC次数
- FGCT :从应用程序启动到采样时老年代(全GC)GC所用时间(s)
- GCT:从应用程序启动到采样时GC用的总时间(s)
jmap
jmap是JDK自带的监控工具,在JDK的根目录中可以找到。主要用来查看Java进程对内存的使用情况
1、查看类列表,包含实例数、占用内存大小jmap -histo[:live] pid
2、查看动态链接库的列表jmap pid
3、查看Java堆的概要信息jmap -heap pid
4、生成Java虚拟机的堆转储快照 dump文件jmap -dump:[live,] format=b,file=./heap.hprof pid
live参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。
format=b表示以hprof二进制格式转储Java堆的内存。
file=用于指定快照dump文件的文件名。
注意,如果是k8s中自启动的java项目的pid可能为1,导致无法找到这个默认进程。
jhat
主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
使用jmap等方法生成java的堆文件后,使用其进行分析。
第一步:导出堆
jmap -dump:live,file=a.log pid
除了jmap还有以下方法获取
- 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)、
- 虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。
- 使用 hprof 命令
第二步:分析堆文件
jhat -J-Xmx512M a1.log
说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。
解析Java堆转储文件,并启动一个 web server
第三步:查看html
http://ip:7000/
对于jhat启动后显示的html页面中功能:
- (1)显示出堆中所包含的所有的类
- (2)从根集能引用到的对象
- (3)显示平台包括的所有类的实例数量
- (4)堆实例的分布表
- (5)执行对象查询语句
当需要进行语句查询是:
输入内容如:#查询长度大于100的字符串
select s from java.lang.String s where s.count > 100
jstack
jstack命令用于生成虚拟机当前时刻的线程快照。
jstack 命令格式如下jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
option
选项 作用
- -F 当正常输出的请求不被响应时,强制输出线程堆栈
- -m 如果调用到本地方法的话,可以显示C/C++的堆栈
- -l 除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
Java语言定义了6种线程池状态:
- New:创建后尚未启动的线程处于这种状态,不会出现在Dump中。
- RUNNABLE:包括Running和Ready。线程开启start()方法,会进入该状态,在虚拟机内执行的。
- Waiting:无限的等待另一个线程的特定操作。
- Timed Waiting:有时限的等待另一个线程的特定操作。
- 阻塞(Blocked):在程序等待进入同步区域的时候,线程将进入这种状态,在等待监视器锁。
- 结束(Terminated):已终止线程的线程状态,线程已经结束执行。
Dump文件的线程状态一般其实就以下3种:
- RUNNABLE,线程处于执行中
- BLOCKED,线程被阻塞
- WAITING,线程正在等待
Dump 文件分析关注重点
- runnable,线程处于执行中
- deadlock,死锁(重点关注)
- blocked,线程被阻塞 (重点关注)
- Parked,停止
- locked,对象加锁
- waiting,线程正在等待
- waiting to lock 等待上锁
- Object.wait(),对象等待中
- waiting for monitor entry 等待获取监视器(重点关注)
- Waiting on condition,等待资源(重点关注),最常见的情况是线程在等待网络的读写
jinfo
jinfo命令用于打印指定Java进程或核心文件或远程调试服务器的Java配置信息。这些配置信息包括Java系统属性和Java虚拟机(JVM)命令行标志。
如果指定的进程运行在64位JVM上,则需要用:jinfo -J-d64 -sysprops pid命令。
jinfo命令可能会在之后的版本中删除。
语法jinfo [ option ] pid 连接到正在运行的进程
jinfo [ option ] executable core 连接到核心文件
jinfo [ option ] [ servier-id ] remote-hostname-or-IP 要连接到远程DEBUG服务器
- executable:生成core dump的Java可执行文件
- core:要打印内存映射的核心文件
- server-id:服务器的ID。如果多个DEBUG服务器在同一个远程主机上运行,则各个服务器的ID必须唯一
- remote-hostname:远程DEBUG服务器的主机名
- IP:远程DEBUG服务器的IP
参数说明
- no-option
打印命令行标志和系统属性的【name-value】对。 - -flag name
打印指定命令行标志的【name-value】对。 - -flag [+|-]name
启用或禁用指定的命令行标志。
表示启用,- 表示禁用。 - -flag name=value
将指定的命令行标志设置为指定的值。
注意:不是所有的flag都可以通过命令行改变!!! - -flags
打印传递给JVM的命令行标志。 - -sysprops
以【name-value】对的形式打印Java系统属性。 - -h or -help
打印jinfo命令的帮助信息。
jconsole
Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到。它用于连接正在运行的本地或者远程的JVM,对正在运行的环境进行查看。
jvisualvm
jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。jvisualvm --openpid 44620
安装插件
在这里找到对应jdk版本号的地址https://visualvm.github.io/pluginscenters.html,复制到插件中心里面即可。
Memory Analyzer Tool
一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
下载地址 http://www.eclipse.org/mat/downloads.php
这里需要找对版本号。
GChisto
一款专业分析gc日志的工具
需要自己编译运行
git 地址https://github.com/jewes/gchisto