JVM:JDK命令行工具

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010647035/article/details/88066068

文章目录

常用工具介绍

1、jcmd:综合工具

将诊断命令请求发送到正在运行的Java虚拟机(JVM)。

命令格式

 jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
 jcmd -l                                       jcmd -h  

参数描述

pid: 进程ID。

main class : 接收诊断命令请求的进程的main类。匹配进程时,main类名称中包含指定子字符串的任何进程均是匹配的。如果多个正在运行的Java进程共享同一个main类,诊断命令请求将会发送到所有的这些进程中。

command:

jcmd 命令参数,通过 jcmd 【pid】 help ,查看可用的参数

Perfcounter.print:

打印目标Java进程上可用的性能计数器。性能计数器的列表可能会随着Java进程的不同而产生变化。

-f file:

从文件file中读取命令,然后在目标Java进程上调用这些命令。在file中,每个命令必须写在单独的一行。以"#"开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。

-l:

查看所有的进程列表信息

-h:

查看帮助信息

应用示例

jcmd 或 jcmd -l

查看进程列表

[root@123 ~]# jcmd
14981 azkaban.execapp.AzkabanExecutorServer -conf ./internal/../../conf
13701 org.apache.hadoop.hdfs.qjournal.server.JournalNode
24934 org.apache.hadoop.hdfs.tools.DFSZKFailoverController
13703 org.apache.hadoop.hdfs.server.datanode.DataNode
28104 sun.tools.jcmd.JCmd
13163 org.apache.spark.deploy.yarn.ApplicationMaster --class org.apache.livy.rsc.driver.RSCDriverBootstrapper --properties-file /data/yarn/nm/usercache/root/appcache/application_1550467502257_0206/container_e51_1550467502257_0206_01_000001/__spark_conf__/__spark_conf__.properties
29105 org.apache.livy.server.LivyServer
19282 org.apache.hive.beeline.BeeLine
19893 com.cloudera.kafka.wrap.Kafka /var/run/cloudera-scm-agent/process/3197-kafka-KAFKA_BROKER/kafka.properties
19510 org.apache.hadoop.hdfs.server.namenode.NameNode
14871 org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer

jcmd [pid] PerfCounter.print

查看性能统计

[root@123 ~]# jcmd 29105 PerfCounter.print
29105:
java.ci.totalTime=16623259896
java.cls.loadedClasses=6804
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=0
java.property.java.endorsed.dirs="/data/jdk1.8.0_152/jre/lib/endorsed"
java.property.java.ext.dirs="/data/jdk1.8.0_152/jre/lib/ext:/usr/java/packages/lib/ext"
java.property.java.home="/data/jdk1.8.0_152/jre"
java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
java.property.java.version="1.8.0_152"
java.property.java.vm.info="mixed mode"
java.property.java.vm.name="Java HotSpot(TM) 64-Bit Server VM"
java.property.java.vm.specification.name="Java Virtual Machine Specification"
java.property.java.vm.specification.vendor="Oracle Corporation"
java.property.java.vm.specification.version="1.8"
java.property.java.vm.vendor="Oracle Corporation"
java.property.java.vm.version="25.152-b16"

jcmd [PID] help

查看进程可使用的参数

[root@123 ~]# jcmd 29105 help
29105:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print       查看线程堆栈信息。
GC.class_stats
GC.class_histogram 查看系统中类统计信息
GC.heap_dump       查看 JVM 的Heap Dump
GC.run_finalization 对 JVM 执行 java.lang.System.runFinalization()
GC.run             对 JVM 执行 java.lang.System.gc()
VM.uptime          查看 jvm 启动时长
VM.flags           查看 JVM 的启动参数
VM.system_properties   查看 JVM 的属性信息
VM.command_line    查看 JVM 的启动命令行
VM.version         查看目标jvm进程的版本信息
help

JRF 命令
JRF 功能跟 jmc.exe 工具的飞行记录器的功能一样的。
要使用 JRF 相关的功能,必须使用 VM.unlock_commercial_features 参数取消锁定商业功能 。

查看具体命令的选项

如果想查看命令的选项,比如想查看 VM.flags 命令选项,可以通过如下命令:

jcmd 11772 help JFR.dump

[root@hadoop-slave2 ~]# jcmd 29105 help VM.flags
29105:
VM.flags
Print VM flag options and their current values.

Impact: Low

Permission: java.lang.management.ManagementPermission(monitor)

Syntax : VM.flags [options]

Options: (options must be specified using the <key> or <key>=<value> syntax)
	-all : [optional] Print all flags supported by the VM (BOOLEAN, false)

2、jps:虚拟机进程状况工具

jps(JVM Process Status Tool)可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。

虽然功能比较单一,但它是使用频率最高的JDK命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(Process Identifier,PID)是一致的。

命令格式

输出JVM中运行的进程状态信息

jps [options] [hostid]

[root@123 ~]# jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]

参数说明

-q:只输出进程 ID
-m:输出传入 main 方法的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
-V:输出通过flag文件传递到JVM中的参数

应用示例

jps

jps 不带参数,默认显示 进程ID 和 启动类的名称。

[root@123 ~]# jps
19893 Kafka
20223 QuorumPeerMain

jps -q

参数 -q 只输出进程ID,不显示类的名称

[root@123~]# jps -q
19893
20223

jps -m

参数 -m 输出传递给 Java 进程(main 方法)的参数

[root@123 ~]# jps -m
6756 Jps -m
19893 Kafka /var/run/cloudera-scm-agent/process/3197-kafka-KAFKA_BROKER/kafka.properties
20223 QuorumPeerMain /var/run/cloudera-scm-agent/process/3074-zookeeper-server/zoo.cfg

jps -l

参数 -l 可以输出主函数的完整路径

[root@123 ~]# jps -l
19893 com.cloudera.kafka.wrap.Kafka
20223 org.apache.zookeeper.server.quorum.QuorumPeerMain

jps -v

参数 -v 可以显示传递给 Java 虚拟机的参数

[root@123 ~]# jps -v
19893 Kafka -Xmx1024M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/kafka_kafka-KAFKA_BROKER-c40b11bae2ae5ca0f7efce30901addb0_pid19893.hprof

3、jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程[1]虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

命令格式

jstat[option vmid[interval[s|ms][count]]]

Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as 
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.


option: 参数选项

-t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间

-h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头

vmid: Virtual Machine ID( 进程的 pid)

interval: 执行每次的间隔时间,单位为毫秒

count: 用于指定输出多少次记录,缺省则会一直打印

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:

[protocol:][//]lvmid[@hostname[:port]/servername]

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:

jstat-gc 2764 250 20

参数说明

[root@123 ~]# jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

-class: 监视类加载、卸载数量、总空间以及类装在所耗费的时间

-compiler: 输出JIT编译器编译过的方法、耗时信息

-gc: 监视java堆状况,包括 Eden 区、两个Survivor区、老年代、永久代等的容量、已用空间、GC 时间合计等信息

-gccapacity: 输出内容同 -gc,主要关注java堆各个区域使用使用的最大、最小空间

-gccause: 同 -gcutil 功能,会额外输出导致上次GC产生的原因

-gcmetacapacity: 监视元数据空间使用情况

-gcnew: 监视新生代 GC 情况

-gcnewcapacity: 监视内容同 -gcnew,主要 关注使用的最大、最小空间

-gcold: 监视老年代 GC 情况

-gcoldcapacity: 监视内容同 -gcold,主要 关注使用的最大、最小空间

-gcutil: 输出内容同 -gc,主要关注已使用空间占总空间的百分比

-printcompilation: 输出已经被JIT编译的方法

应用示例

jstat -class 类加载统计

[root@123 ~]# jstat -class 29105
Loaded  Bytes  Unloaded  Bytes     Time   
  6804 13733.8        0     0.0       1.94

  • Loaded : 已经装载的类的数量
  • Bytes : 装载类所占用的字节数
  • Unloaded:已经卸载类的数量
  • Bytes:卸载类的字节数
  • Time:装载和卸载类所花费的时间

jstat -compiler 编译统计

[root@123 ~]# jstat -compiler 29105
Compiled Failed Invalid   Time   FailedType FailedMethod
    7822      0       0    17.12          0             
  • Compiled:编译任务执行数量
  • Failed:编译任务执行失败数量
  • Invalid :编译任务执行失效数量
  • Time :编译任务消耗时间
  • FailedType:最后一个编译失败任务的类型
  • FailedMethod:最后一个编译失败任务所在的类及方法

jstat –gc 垃圾回收统计

[root@123 ~]# jstat -gc 29105
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
20992.0 20480.0  0.0   1686.6 1626112.0 404770.7  317440.0   25081.6   41680.0 41065.1 5632.0 5435.2      9    0.055   2      0.100    0.155

  • S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  • S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  • S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  • S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  • EC :年轻代中Eden(伊甸园)的容量 (字节)
  • EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
  • OC :Old代的容量 (字节)
  • OU :Old代目前已使用空间 (字节)
  • MC:metaspace(元空间)的容量 (字节)
  • MU:metaspace(元空间)目前已使用空间 (字节)
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

#### jstat -gccapacity 堆内存统计

[root@123 ~]# jstat -gccapacity 29105
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
342528.0 5479424.0 2329088.0 20992.0 20480.0 1626112.0   685568.0 10959872.0   317440.0   317440.0      0.0 1085440.0  41680.0      0.0 1048576.0   5632.0      9     2
  • NGCMN :年轻代(young)中初始化(最小)的大小(字节)
  • NGCMX :年轻代(young)的最大容量 (字节)
  • NGC :年轻代(young)中当前的容量 (字节)
  • S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
  • S1C : 年轻代中第二个survivor(幸存区)的容量 (字节)
  • EC :年轻代中Eden(伊甸园)的容量 (字节)
  • OGCMN :old代中初始化(最小)的大小 (字节)
  • OGCMX :old代的最大容量(字节)
  • OGC:old代当前新生成的容量 (字节)
  • OC :Old代的容量 (字节)
  • MCMN:metaspace(元空间)中初始化(最小)的大小 (字节)
  • MCMX :metaspace(元空间)的最大容量 (字节)
  • MC :metaspace(元空间)当前新生成的容量 (字节)
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • FGC:从应用程序启动到采样时old代(全gc)gc次数

jstat -gcmetacapacity 元数据空间统计

[root@123 ~]# jstat -gcmetacapacity 29105
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1085440.0    41680.0        0.0  1048576.0     5632.0     9     2    0.100    0.155
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

jstat -gcnew 新生代垃圾回收统计

[root@123 ~]# jstat -gcnew 29105
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
20992.0 20480.0    0.0 1686.6  2  15 20992.0 1626112.0 445487.1      9    0.055

  • S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
  • S1C :年轻代中第二个survivor(幸存区)的容量 (字节)
  • S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  • S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  • TT:持有次数限制
  • MTT:最大持有次数限制
  • DSS:期望的幸存区大小
  • EC:年轻代中Eden(伊甸园)的容量 (字节)
  • EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

jstat -gcnewcapacity 新生代内存统计

[root@123 ~]# jstat -gcnewcapacity 29105
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
  342528.0  5479424.0  2329088.0 1826304.0  20992.0 1826304.0  20480.0  5478400.0  1626112.0     9     2

  • NGCMN :年轻代(young)中初始化(最小)的大小(字节)
  • NGCMX :年轻代(young)的最大容量 (字节)
  • NGC :年轻代(young)中当前的容量 (字节)
  • S0CMX :年轻代中第一个survivor(幸存区)的最大容量 (字节)
  • S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
  • S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
  • S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  • ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
  • EC:年轻代中Eden(伊甸园)的容量 (字节)
  • YGC:从应用程序启动到采样时年轻代中gc次数
  • FGC:从应用程序启动到采样时old代(全gc)gc次数

jstat -gcold 老年代垃圾回收统计

[root@123 ~]# jstat -gcold 29105
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 41680.0  41065.1   5632.0   5435.2    317440.0     25081.6      9     2    0.100    0.155
  • MC :metaspace(元空间)的容量 (字节)
  • MU:metaspace(元空间)目前已使用空间 (字节)
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:Old代的容量 (字节)
  • OU:Old代目前已使用空间 (字节)
  • YGC:从应用程序启动到采样时年轻代中gc次数
  • FGC:从应用程序启动到采样时old代(全gc)gc次数
  • FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

jstat -gcoldcapacity 老年内存统计

[root@123 ~]# jstat -gcoldcapacity 29105
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   685568.0  10959872.0    317440.0    317440.0     9     2    0.100    0.155

  • OGCMN :old代中初始化(最小)的大小 (字节)
  • OGCMX :old代的最大容量(字节)
  • OGC :old代当前新生成的容量 (字节)
  • OC :Old代的容量 (字节)
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

jstat -gcutil 整体垃圾回收统计

[root@123 ~]# jstat -gcutil 29105
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   8.24  29.91   7.90  98.52  96.51      9    0.055     2    0.100    0.155

  • 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)

jstat -gccause 最近一次垃圾回收原因

[root@123 ~]# jstat -gccause 29105
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
  0.00   8.24  30.40   7.90  98.52  96.51      9    0.055     2    0.100    0.155 Allocation Failure   No GC 
  • S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  • S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  • E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
  • O :old代已使用的占当前容量百分比
  • M : 元数据区使用比例
  • CCS :压缩使用比例
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)
  • LGCC:最后一次GC原因
  • GCC:当前GC原因(No GC 为当前没有执行GC)

jstat -printcompilation 当前VM执行的信息

[root@123 ~]# jstat -printcompilation 29105
Compiled  Size  Type Method
    7839     17    1 java/util/regex/Pattern$CharProperty$1 isSatisfiedBy

  • Compiled :编译任务的数目
  • Size :方法生成的字节码的大小
  • Type:编译类型
  • Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的

4、jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。

使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 1.6或以上版本的话,使用java-XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择),jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties()的内容打印出来。

命令格式

[root@123 ~]# jinfo -h
Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

参数说明

无参数 输出全部的参数和系统属性
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性

应用示例

java -XX:+PrintFlagsFinal -version 输出全部参数

[root@123 ~]# java -XX:+PrintFlagsFinal -version
[Global flags]
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
    uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}
    uintx AdaptiveSizePolicyWeight                  = 10                                  {product}
    uintx AdaptiveSizeThroughPutPolicy              = 0                                   {product}
    uintx AdaptiveTimeWeight                        = 25                                  {product}
     bool AdjustConcurrency                         = false                               {product}
     bool AggressiveOpts                            = false                               {product}
     intx AliasLevel                                = 3                                   {C2 product}
     bool AlignVector                               = false                               {C2 product}
     intx AllocateInstancePrefetchLines             = 1                                   {product}
     intx AllocatePrefetchDistance                  = 192                                 {product}
     intx AllocatePrefetchInstr                     = 3                                   {product}
     intx AllocatePrefetchLines                     = 4                                   {product}
     intx AllocatePrefetchStepSize                  = 64                                  {product}
     intx AllocatePrefetchStyle                     = 1                                   {product}
     bool AllowJNIEnvProxy                          = false                               {product}
     bool AllowNonVirtualCalls                      = false                               {product}
     bool AllowParallelDefineClass                  = false                               {product}
     bool AllowUserSignalHandlers                   = false                               {product}
-----------------------省略-------------------------

java -XX:+PrintFlagsFinal -version |grep manageable 输出可修改值的参数

[root@123 ~]# java -XX:+PrintFlagsFinal -version |grep manageable
     intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
     intx CMSTriggerInterval                        = -1                                  {manageable}
     intx CMSWaitDuration                           = 2000                                {manageable}
     bool HeapDumpAfterFullGC                       = false                               {manageable}
     bool HeapDumpBeforeFullGC                      = false                               {manageable}
     bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
    ccstr HeapDumpPath                              =                                     {manageable}
    uintx MaxHeapFreeRatio                          = 100                                 {manageable}
    uintx MinHeapFreeRatio                          = 0                                   {manageable}
     bool PrintClassHistogram                       = false                               {manageable}
     bool PrintClassHistogramAfterFullGC            = false                               {manageable}
     bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
     bool PrintConcurrentLocks                      = false                               {manageable}
     bool PrintGC                                   = false                               {manageable}
     bool PrintGCDateStamps                         = false                               {manageable}
     bool PrintGCDetails                            = false                               {manageable}
     bool PrintGCID                                 = false                               {manageable}
     bool PrintGCTimeStamps                         = false                               {manageable}

jinfo 输出当前 jvm 进程的全部参数和系统属性

[root@123 ~]# jinfo 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Java System Properties:

com.sun.management.jmxremote.authenticate = false
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.152-b16
sun.boot.library.path = /data/jdk1.8.0_152/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
java.rmi.server.randomIDs = true
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = US
user.dir = /root
----------------------省略-------------------

jinfo -flag 输出对应名称的参数

[root@123 ~]# jinfo -flag UseParallelGC 20105
-XX:+UseParallelGC

jinfo -flag [+|-] 开启或关闭指定参数

[root@123 ~]# jinfo -flag +PrintGC 20105
[root@123 ~]# jinfo -flag PrintGC 20105
-XX:+PrintGC

jinfo -flag = 修改指定参数的值

修改之前
[root@123 ~]# jinfo -flag PrintGCDetails 20105
-XX:-PrintGCDetails
修改命令
[root@123 ~]# jinfo -flag PrintGCDetails=1 20105
修改之后
[root@123 ~]# jinfo -flag PrintGCDetails 20105
-XX:+PrintGCDetails

jinfo -flags 输出指定 全部参数

[root@123 ~]# jinfo -flags 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=1052770304 -XX:+ManagementServer -XX:MaxHeapSize=16833839104 -XX:MaxNewSize=5610930176 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=350748672 -XX:OldSize=702021632 -XX:+PrintGC -XX:-PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
Command line:  -Djava.rmi.server.hostname=192.168.12.201 -Dcom.sun.management.jmxremote.port=19889 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

jinfo -sysprops 输出指定当前 jvm 全部的系统属性

[root@123 ~]# jinfo -sysprops 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
com.sun.management.jmxremote.authenticate = false
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.152-b16
sun.boot.library.path = /data/jdk1.8.0_152/jre/lib/amd64
livy.server.server-url = http://hadoop-slave2:9889
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
java.rmi.server.randomIDs = true
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = US
user.dir = /root
java.vm.specification.name = Java Virtual Machine Specification
com.sun.management.jmxremote.port = 19889
java.runtime.version = 1.8.0_152-b16
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /data/jdk1.8.0_152/jre/lib/endorsed
----------------------省略--------------------------

5、jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。

如果不使用jmap命令,要想获取Java堆转储快照,还有一些比较“暴力”的手段:

-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件

-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成dump文件

jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。

命令格式

jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP

参数说明

[root@hadoop-slave2 ~]# jmap -h
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

参数:

option: 选项参数。

pid: 需要打印配置信息的进程ID。

executable: 产生核心dump的Java可执行文件。

core: 需要打印配置信息的核心文件。

server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。

remote server IP or hostname 远程调试服务器的IP地址或主机名。

option 选项

no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。

heap: 显示Java堆详细信息

histo[:live]: 显示堆中对象的统计信息

clstats: 打印类加载器信息

finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象

dump:: 生成堆转储快照

**F: ** 如果pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,live子参数无效.

help: 打印帮助信息

J: 指定传递给运行jmap的JVM的参数

应用示例

jmap pid 查看进程的内存映像信息

[root@hadoop-slave2 ~]# jmap 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
0x0000000000400000	7K	/data/jdk1.8.0_152/bin/java
0x00007fdd2c83a000	86K	/usr/lib64/libgcc_s-4.8.5-20150702.so.1
0x00007fdd58002000	251K	/data/jdk1.8.0_152/jre/lib/amd64/libsunec.so
0x00007fdd5a86d000	7K	/data/jdk1.8.0_152/jre/lib/amd64/libjaas_unix.so
0x00007fdd6421c000	91K	/data/jdk1.8.0_152/jre/lib/amd64/libnio.so
0x00007fdd6472e000	112K	/data/jdk1.8.0_152/jre/lib/amd64/libnet.so
0x00007fdd64945000	49K	/data/jdk1.8.0_152/jre/lib/amd64/libmanagement.so
0x00007fdd8cbac000	125K	/data/jdk1.8.0_152/jre/lib/amd64/libzip.so
0x00007fdd8cdc8000	60K	/usr/lib64/libnss_files-2.17.so
0x00007fdd8cfdb000	221K	/data/jdk1.8.0_152/jre/lib/amd64/libjava.so
0x00007fdd8d207000	64K	/data/jdk1.8.0_152/jre/lib/amd64/libverify.so
0x00007fdd8d416000	43K	/usr/lib64/librt-2.17.so
0x00007fdd8d61e000	1112K	/usr/lib64/libm-2.17.so
0x00007fdd8d920000	16640K	/data/jdk1.8.0_152/jre/lib/amd64/server/libjvm.so
0x00007fdd8e91c000	2077K	/usr/lib64/libc-2.17.so
0x00007fdd8ecdf000	19K	/usr/lib64/libdl-2.17.so
0x00007fdd8eee3000	101K	/data/jdk1.8.0_152/lib/amd64/jli/libjli.so
0x00007fdd8f0f9000	141K	/usr/lib64/libpthread-2.17.so
0x00007fdd8f315000	160K	/usr/lib64/ld-2.17.so

jmap -heap 打印Java堆详细信息

打印一个进程堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

[root@123 ~]# jmap -heap  20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 16833839104 (16054.0MB)
   NewSize                  = 350748672 (334.5MB)
   MaxNewSize               = 5610930176 (5351.0MB)
   OldSize                  = 702021632 (669.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 495976448 (473.0MB)
   used     = 394750680 (376.46358489990234MB)
   free     = 101225768 (96.53641510009766MB)
   79.59060991541276% used
From Space:
   capacity = 43515904 (41.5MB)
   used     = 4820096 (4.5968017578125MB)
   free     = 38695808 (36.9031982421875MB)
   11.076630741716867% used
To Space:
   capacity = 43515904 (41.5MB)
   used     = 0 (0.0MB)
   free     = 43515904 (41.5MB)
   0.0% used
PS Old Generation
   capacity = 327680000 (312.5MB)
   used     = 19327496 (18.43213653564453MB)
   free     = 308352504 (294.06786346435547MB)
   5.89828369140625% used

13208 interned Strings occupying 1158728 bytes.

jmap -histo:live 打印堆中对象的信息

其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。VM内部类名称使用“*”前缀打印。 如果指定了live子选项,则只计算活动的对象。

[root@123 ~]# jmap -histo:live 20105
2439:             1             16  sun.security.x509.GeneralNames
2440:             1             16  sun.security.x509.RFC822Name
2441:             1             16  sun.text.normalizer.NormalizerBase$Mode
2442:             1             16  sun.text.normalizer.NormalizerBase$NFCMode
2443:             1             16  sun.text.normalizer.NormalizerBase$NFDMode
2444:             1             16  sun.text.normalizer.NormalizerBase$NFKCMode
2445:             1             16  sun.text.normalizer.NormalizerBase$NFKDMode
2446:             1             16  sun.util.calendar.Gregorian
2447:             1             16  sun.util.locale.provider.AuxLocaleProviderAdapter$NullProvider
2448:             1             16  sun.util.locale.provider.CalendarDataUtility$CalendarWeekParameterGetter
2449:             1             16  sun.util.locale.provider.SPILocaleProviderAdapter
2450:             1             16  sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
2451:             1             16  sun.util.resources.LocaleData
2452:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total        170196       10622016

jmap -clstats 打印类加载器信息

-clstats 是 -permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

[root@123 ~]# jmap -clstats 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness......................liveness analysis may be inaccurate ...
class_loader	classes	bytes	parent_loader	alive?	type

<bootstrap>	2030	3517229	  null  	live	<internal>
0x00000003d4a243a0	5019	8316626	0x00000003d4a2de50	live	sun/misc/Launcher$AppClassLoader@0x00000007c000f6a0
0x00000003d535e570	1	1473	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535ebb0	1	880	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d720	1	880	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535e638	1	881	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535ec78	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d1a8	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4f0e260	1	880	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535ea20	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535f220	1	1471	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d270	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6dd30	1	880	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6e2f0	4	4029	  null  	dead	javax/management/remote/rmi/NoCallStackClassLoader@0x00000007c00c9448
0x00000003d4f0e328	1	1474	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535eae8	1	1474	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d338	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6def8	1	1471	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4f0e0d0	1	1474	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d530be50	6	10342	  null  	live	com/esotericsoftware/reflectasm/AccessClassLoader@0x00000007c0509fe0
0x00000003d535e890	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535f090	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d400	1	1472	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6dfc0	1	1471	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4f0e198	1	1472	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d538e9d0	0	0	0x00000003d4a243a0	live	com/esotericsoftware/reflectasm/AccessClassLoader@0x00000007c0509fe0
0x00000003d4d3d4b8	0	0	0x00000003d4a243a0	dead	java/util/ResourceBundle$RBClassLoader@0x00000007c00e0c28
0x00000003d535e958	1	881	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535f158	1	1494	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d4c8	1	1474	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6e088	1	1471	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a2de50	36	112511	  null  	live	sun/misc/Launcher$ExtClassLoader@0x00000007c000fa48
0x00000003d535e700	1	1471	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535ed40	1	1472	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535ef00	1	1473	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d590	1	880	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6e150	1	1471	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4f0e008	1	880	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535e7c8	1	881	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535ee08	1	880	0x00000003d4a243a0	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d535efc8	1	1473	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6d658	1	880	  null  	dead	sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000003d4a6e218	2	4839	  null  	dead	javax/management/remote/rmi/NoCallStackClassLoader@0x00000007c00c9448

total = 43	7132	12010607	    N/A    	alive=5, dead=38	    N/A    


jmap -finalizerinfo 打印等待终结的对象信息

[root@hadoop-slave2 ~]# jmap -finalizerinfo 20105
Attaching to process ID 20105, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
Number of objects pending for finalization: 0

jmap -dump:format=b,file=heapdump.txt 生成堆转储快照dump文件

详见:https://blog.csdn.net/u010647035/article/details/86563736

6、jhat:虚拟机堆转储快照分析工具

Sun JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。
推荐好用的分析工具:https://blog.csdn.net/u010647035/article/details/86563736

命令格式

jhat [ options ]

参数说明

[root@123 ~]# jhat -h
Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

	-J<flag>          Pass <flag> directly to the runtime system. For
			  example, -J-mx512m to use a maximum heap size of 512MB
	-stack false:     Turn off tracking object allocation call stack.
	-refs false:      Turn off tracking of references to objects
	-port <port>:     Set the port for the HTTP server.  Defaults to 7000
	-exclude <file>:  Specify a file that lists data members that should
			  be excluded from the reachableFrom query.
	-baseline <file>: Specify a baseline object dump.  Objects in
			  both heap dumps with the same ID and same class will
			  be marked as not being "new".
	-debug <int>:     Set debug level.
			    0:  No debug output
			    1:  Debug hprof file parsing
			    2:  Debug hprof file parsing, no server
	-version          Report version number
	-h|-help          Print this help and exit
	<file>            The file to read

For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".

All boolean options default to "true"

**-J< flag > **

因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.

**-stack false|true **

关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.

**-refs false|true **

关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。

**-port port-number **
设置 jhat HTTP server 的端口号. 默认值 7000。

**-exclude exclude-file **

指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。

**-baseline exclude-file **

指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用。

**-debug int **

设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息。

**-version **

启动后只显示版本信息就退出。

应用示例

#将内存使用的详细情况输出到dump.txt 文件
jmap -dump:format=b,file=dump.txt <pid> 

#解析堆转储文件
jhat -J-Xmx512m dump.txt
访问http://ip-server:7000查看

7、jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。

线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

命令格式

jstack [ options ]

参数说明

[root@123 ~]# jstack -h
Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

-F 当’jstack [-l] pid’没有响应的时候强制打印栈信息

-m 打印java和native c/c++框架的所有栈信息

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.

-h | -help 打印帮助信息

应用示例

jstack 查看指定进程的线程信息

[root@hadoop-slave2 ~]# jstack 20105
2019-03-01 17:59:20
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode):

"qtp605101809-69" #69 prio=5 os_prio=0 tid=0x00007fdcb45b4000 nid=0x3e26 waiting on condition [0x00007fdd5995a000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000003d4f3d870> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
	at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:389)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:531)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.access$700(QueuedThreadPool.java:47)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:590)
	at java.lang.Thread.run(Thread.java:748)

"Attach Listener" #67 daemon prio=9 os_prio=0 tid=0x00007fdd14001000 nid=0x5bad waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
-----------------------省略------------------------------

猜你喜欢

转载自blog.csdn.net/u010647035/article/details/88066068