JVM-工具

  1. jps
  2. jstat
  3. jmap
  4. jhat
  5. 第一步:导出堆
  6. 第二步:分析堆文件
  7. 第三步:查看html
  8. jstack
  9. jinfo
  10. jconsole
  11. jvisualvm
  12. Memory Analyzer Tool
  13. GChisto

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)

https://img-blog.csdnimg.cn/aaa166818181449da9f695d45f8c5ec4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ0Nxd2Fz,size_20,color_FFFFFF,t_70,g_se,x_16

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还有以下方法获取

  1. 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)、
  2. 虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。
  3. 使用 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