2.6.1 命令行终端

  • 标准终端类:jps、jinfo、jstat、jstack、jmap
  • 功能整合类:jcmd、vjtools、arthas、greys

2.6.2 可视化界面

  • 简易:JConsole、JVisualvm、HA、GCHisto、GCViewer
  • 进阶:MAT、JProfiler

命令行推荐 arthas ,可视化界面推荐 JProfiler,此外还有一些在线的平台 gceasy、heaphero、fastthread

1. jmap java自带


命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

  • 更多命令参考 : https://www.jianshu.com/p/a4ad53179df3

    1.1 dump: JVM 中内存信息

    命令: jmap -dump:format=b,file=ai-heapdump.phrof {pid}
    描述:生成堆转储快照dump文件。
    以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

    这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

1.1.1 dump分析

  1. jmap -dump:format=b,file=/tmp/dump.bin 1
  1. eclipse Memory Analyzer

Eclipse 提供的一个用于分析JVM 堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。
http://www.eclipse.org/mat/

  1. 使用jvisualvm来分析dump文件:

jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jvisualvm.exe。
jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。
像我这种从服务器上dump下来文件也可以直接扔给jvisualvm来分析。
使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。

1.2 jmap -histo [pid] JVM堆中对象详细占用情况

1.3 jmap -heap [pid] 查看整个JVM内存状态

要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起

2. jstack


jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

语法格式如下:

  1. jstack [option] pid
  2. jstack [option] executable core
  3. jstack [option] [server-id@]remote-hostname-or-ip

option

  1. -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
  2. -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息
jps 查询出 java进程ID 8672
第二步找出该进程内最耗费CPU的线程,
可以使用ps -Lfp 8672或者ps -mp 8672 -o THREAD,tid,time或者top -Hp 8672
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为8672的线程,用

printf "%x\n" 8672
21e0

得到8672的十六进制值为21e0

它用jstack来输出进程8672的堆栈信息,然后根据线程ID的十六进制值grep,如下:
jstack 8672| grep 21e0

3. [可视化工具] jconsole

4. jstat -gcutil [pid]

更多文章: 作者:jijs 链接:https://www.jianshu.com/p/213710fb9e40
统计gc信息

  • S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  • S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  • E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
  • O :old代已使用的占当前容量百分比
  • P :perm代已使用的占当前容量百分比
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

5. jps

jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序。 通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息。

jps [options] [hostid]
jps -v 打印参数
如果不指定hostid就默认为当前主机或服务器。

命令行参数选项说明如下:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数

jinfo -flags pid

查看 jvm 启动参数

VisualVM:

故障处理工具