当前位置: 首页 > news >正文

JDK Tools and Utilities---Java Troubleshooting, Profiling, Monitoring and Management Tools

为什么80%的码农都做不了架构师?>>>   hot3.png

                               Java Troubleshooting, Profiling, Monitoring and Management Tools

从官网互获取的一部分tools描述

Standard JDK Tools and Utilities

Basic Tools (appletviewer, extcheck, jar, java, javac, javadoc, javah, javap, jdb, jdeps)
Security Tools (keytool, jarsigner, policytool, kinit, klist, ktab)
Internationalization Tools (native2ascii)
Remote Method Invocation (RMI) Tools (rmic, rmiregistry, rmid, serialver)
Java IDL and RMI-IIOP Tools (tnameserv, idlj, orbd, servertool)
Java Deployment Tools (javapackager, pack200, unpack200)
Java Web Start Tools (javaws)
Java Troubleshooting, Profiling, Monitoring and Management Tools (jcmd, jconsole, jmc, jvisualvm)
Java Web Services Tools (schemagen, wsgen, wsimport, xjc)
Experimental JDK Tools and Utilities

NOTE - The tools described in this section are unsupported and experimental in nature and should be used with that in mind. They might not be available in future JDK versions.

Monitoring Tools (jps, jstat, jstatd)
Troubleshooting Tools (jinfo, jhat, jmap, jsadebugd, jstack)
Scripting Tools (jrunscript)

 

jcmd命令

jcmd,用于向正在运行的JVM发送诊断信息请求。

jcmd的命令行用法有如下几种:

jcmd [ options ]

jcmd [ pid | main-class ] PerfCounter.print

jcmd [ pid | main-class ] command [ arguments ]

jcmd [ pid | main-class ] -f file
options
命令行选项。请参考选项部分。

pid
接收诊断命令请求的进程ID。该进程必须是一个Java进程。你可以使用jps或jcmd来获取运行于当前计算机上的Java进程列表。

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

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

注意: 如果任何参数含有空格,你必须使用英文的单引号或双引号将其包围起来。 此外,你必须使用转义字符来转移参数中的单引号或双引号,以阻止操作系统shell处理这些引用标记。当然,你也可以在参数两侧加上单引号,然后在参数内使用双引号(或者,在参数两侧加上双引号,在参数中使用单引号)。

举个例子,假设你想要发送一个诊断命令请求到com.example.MyClass name="Value of name argument"。下列3中命令是有效的:

jcmd com.example.MyClass name=\"Value of name argument\"
jcmd com.example.MyClass name="'Value of name argument'"
jcmd com.example.MyClass name='"Value of name argument"'
下列两种命令是无效的:
jcmd com.example.MyClass name=Value\\ of\\ name\\ argument
jcmd com.example.MyClass name="Value\ of\ name\ argument"
Perfcounter.print
打印目标Java进程上可用的性能计数器。性能计数器的列表可能会随着Java进程的不同而产生变化。

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

描述

jcmd 是一个向支持该功能的JVM发送诊断命令请求的工具。

使用不带参数或参数-l,jcmd 将打印运行的Java进程的列表信息,其中包括进程ID、main类和它们的命令行参数。

如果在命令行中指定进程ID,jcmd 将向该进程ID的Java进程发送至诊断命令请求。

如果在命令行中指定main类,jcmd 将向main类包含该子字符串的所有Java进程发送诊断命令请求。

如果使用PerfCounter.print 参数,jcmd 打印目标Java进程上可用的性能计数器。

如果使用-f 选项参数,jcmd 将向目标Java进程发送file中存储的诊断命令。

选项参数

jcmd的选项参数是互斥的(不能同时使用)。你可以直接使用如下命令名称。

-l
打印正在运行的Java进程的列表信息,包括进程ID、main类以及它们的命令行参数。

-h
打印帮助信息。

-help
打印帮助信息。

 

接着后面都是一些单独的监控命令,在tools的描述里面都介绍了一些情况,说这些单独的工具可能在后面会被废弃,但现在在JDK8里面还是存在的,接下来就介绍一些这些东西。

jps命令

jps [ options ] [ hostid ]
options
命令行选项。
hostid
指定为其生成进程报告的主机的主机标识符。hostid可能包括表示通讯协议、端口号以及其他实现特定数据的可选组件。
描述

jps工具用于列出目标系统上安装的HotSpot JVM。此工具仅限于报告JVM在其访问权限内的相关信息。

如果运行jps时没有指定hostid参数,它将查找本地主机上安装的JVM。如果在启动jps的同时指定了一个hostid,则它会使用指定的协议和端口,在hostid所表示的主机上查找JVM。一个jstatd进程被认为正运行于目标主机上。

对于在目标系统上找到的每个JVM而言,jps命令将报告本地虚拟机的标识符,或者lvmid。lvmid通常是,但不一定是,Java进程的操作系统进程标识符。如果没有指定选项参数,jsp将列出每个Java应用程序的lvmid,并紧随在简短格式的应用程序类名或jar文件名称之后。简短格式的类名或jar文件名会忽略掉类的包名信息或jar文件的路径信息。

jps命令使用java启动器来查找类名以及传递给main方法的参数。如果使用自定义启动器来启动JVM,类名(或jar文件名称)和传递给main方法的参数将不可用。在这种情况下,jps命令将会针对类名或jar文件名称和传递给main方法的参数输出"Unknown"字符串。

使用jps命令产生的JVM列表可能受限于授予运行该命令的角色权限。该命令只会列出取决于操作系统特定访问控制机制的具有访问权限的JVM。

注意:此工具是不受支持的,并且无法确定在未来版本的JDK中是否可用。目前,该工具无法在Windows 98和Windows ME平台上使用。
选项

jps命令支持许多修改该命令输出的选项。以后,这些选项可能随时会被更改或移除。

-q
抑制类名、jar文件名称以及传递给main方法的参数的输出,仅产生本地虚拟机标识符的列表。
-m
输出传递给main方法的参数。嵌入式JVM的输出可能为null。
-l
输出应用程序main类的完整包名,或者应用程序jar文件的路径全称。
-v
输出传递给JVM的参数。
-V
输出通过标识文件(.hotspotrc文件或-XX:Flags=<filename>参数指定的文件)传递给JVM的参数。
-Joption
传递选项参数给被javac调用的java启动程序。例如,-J-Xms48m设置启动内存为48 MB。使用-J将选项参数传递给执行Java应用程序的底层虚拟机,这是一种常见惯例。
主机标识符

主机标识符,或hostid,是一个表示目标系统的字符串。hostid字符串的语法与URI的语法基本一致:

[protocol:][[//]hostname][:port][/servername]
protocol
通讯协议。如果protocol被省略,并且没有指定主机名称,则默认协议为一个特定于平台的优化的本地协议。如果protocol被省略,并且指定了主机名称,则默认的协议为rmi。
hostname
表示目标主机的主机名或IP地址。如果主机名被省略,那么目标主机就是本地主机。
port
与远程服务器通讯的默认端口。如果主机名被省略,或者协议指定为一个最佳优化的本地协议,那么端口将被忽略掉。否则,端口参数的处理是一个特定的实现。对于默认的rmi协议,port将采用远程主机上rmiregistry端口号。如果端口被省略,并且协议为rmi,那么将使用默认的rmiregistry端口(1099)。
servername
该参数的处理取决于实现。对于经过优化的本地协议,该字段会被忽略。对于rmi协议,该参数是远程主机上表示RMI远程对象名称的一个字符串。请参考jstatd命令的-n选项。
输出格式

jps命令的输出遵循以下模式:

lvmid[ [classname|JARfilename| "Unknown"] [arg* ] [jvmarg* ] ]
所有的输出标记均使用空格隔开。当尝试映射参数到它们的实际位置参数时,包含嵌入的空格的参数将引入歧义。

注意:由于在未来版本中输出格式可能更改,因此不建议编写脚本来解析jps输出。如果你选择编写解析jps输出的脚本,可能需要针对此工具的未来版本修改这些脚本。
示例

本节提供jps命令的示例。

列出本地主机上的JVM:

jps
18027 Java2Demo.JAR
18032 jps
18005 jstat
列出远程主机上的JVM:
本示例假定jstat服务器和它内部的RMI注册表(或远程主机上单独的外部rmiregistry进程)在默认端口上运行(端口为1099)。它也假定本地主机具有适当的访问远程主机的权限。本示例也包含-l选项参数,用于输出详细格式的类名或jar文件名。

jps -l remote.domain3002 /opt/j2sdk1.5.0/demo/jfc/Java2D/Java2Demo.JAR
2857 sun.tools.jstatd.jstatd
列出使用非默认端口的RMI注册表的远程主机上的JVM:

本示例假定远程主机上运行的jstatd服务器使用绑定端口2002的内部RMI注册表。本示例也使用-m选项参数,以包括每个列出的Java应用的main方法的传递参数。

jps -m remote.domain:20023002 /opt/j2sdk1.5.0/demo/jfc/Java2D/Java2Demo.JAR
3102 sun.tools.jstatd.jstatd -p 2002

 

jstat命令

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption
单个常规的命令行选项(-help,-options,或-version)。
outputOptions
一个或多个输出选项,由一个statOption加上任意的-t,-h和-J选项。
vmid
虚拟机标识符,一个表示目标JVM的字符串。常规语法是:

[protocol:][//]lvmid[@hostname[:port]/servername]
vmid字符串的语法与URI的语法基本保持一致。vmid可以是一个代表本地JVM的简单整数,也可以是一个指定了通讯协议、端口号以及其他特定实现的值的复杂结构。请查看虚拟机标识符了解更多细节。

interval[s|ms]
指定单位(秒/s或毫秒/ms)的采样时间间隔,必须是一个正整数。默认单位为毫秒。如果指定了该选项参数,每过指定的间隔时间,jstat就会产生一次输出。
count
显示的样本数,必须是一个正整数。默认值为无限大;也就是说,jstat将会一直显示统计信息,直到目标JVM终止或者jstat命令被终止。
描述

jstat工具用于显示一个HotSpot Java虚拟机(JVM)的性能统计信息。通过下面描述的虚拟机标识符或vmid选项来标识目标JVM。

注意:此工具是不受支持的,并且无法确定在未来版本的J2SE JDK中是否可用。此工具目前不适用于Windows 98和Windows ME平台。
虚拟机标识符

vmid字符串的语法与URI的语法基本保持一致:

[protocol:][//]lvmid[@hostname][:port][/servername]
protocol
通讯协议。如果protocol被省略并且未指定主机名,则默认协议是一个特定于平台的优化的本地协议。如果protocol被省略并指定了主机名,则默认协议为rmi。
lvmid
目标JVM的本地虚拟机标识符。lvmid是一个特定平台的值,并在系统上唯一地标识一个JVM。lvmid是虚拟机标识符唯一的必需组件。lvmid通常是(但并不一定是)目标JVM进程在该操作系统上的进程标识符。你可以使用jps命令来确定lvmid。另外,在Unix平台上你可以使用ps命令来确定lvmid,在Windows平台上,你可以使用Windows任务管理器来确定lvmid。
hostname
表示目标主机的主机名或IP地址。如果hostname被省略,则默认目标主机为本地主机。
port
与远程服务器通讯的默认端口号。如果hostname被省略,或者protocol指定了一个优化的本地协议,那么port将被忽略。否则,端口参数的处理是一个特定的实现。对于默认的rmi协议来说,port表示远程主机上rmiregistry的端口号。如果port被省略,并且protocol为rmi,那么将使用默认的rmiregistry端口(1099)。
servername
该参数的处理取决于具体实现。对于优化的本地协议而言,该字段将会忽略。对于rmi协议而言,它代表远程主机上RMI远程对象的名称。
选项

jstat命令支持两种类型的选项,常规选项和输出选项。常规选项使得jstat显示简单的用法和版本信息。输出选项决定统计输出的内容和格式。

注意:所有的选项,以及它们的功能作用可能会在未来的版本中变更或移除。
常规选项

如果你指定了一个常规选项,你就不能再指定其他的选项或参数。

-help
显示帮助信息。
-version
显示版本信息。
-options
显示统计选项列表。查看下面的输出选项部分。
输出选项

如果你没有指定常规选项,那么你可以指定输出选项。输出选项用于确定jstat输出的内容和格式,它由一个statOption选项,加上任意的其他输出选项(-h,-t,和-J)组成。statOption必须在第一位置。

输出将被格式化为一个表格,其中的列以空白隔开。头部行拥有标题和描述列。使用-h选项来设置表格头的显示频率。不同选项之间的列标题名称通常是一直的。一般情况下,如果两个选项提供了同一名称的列,那么两个列的数据源是相同的。

使用-t选项来显示一个时间戳列,该列将会是输出的第一个列,标题为Timestamp。Timestamp列包含从目标JVM启动开始计算的已过去的时间,单位为秒。时间戳的精确度取决于多种因素,变化主要取决于高负载系统上的线程调度延迟。

分别使用interval和count参数来确定jstat显示输出的频率和次数。

注意:由于在未来版本中输出格式可能变更,因此不建议编写脚本来解析jstat输出。如果你选择编写解析jstat输出的脚本,可能需要针对此工具的未来版本修改这些脚本。
-statOption
确定jstat显示的统计信息。下表列出了可用的选项。使用常规选项-options可以显示特定平台安装的选项列表。
选项	显示...
class	类加载器的行为统计
compiler	HotSpot即时编译器的行为统计
gc	堆的垃圾回收器的行为统计
gccapacity	Java各代区域以及对应空间的容量统计
gccause	垃圾回收的摘要信息(等同于-gcutil), 以及最后的和当前的(如适用)垃圾回收事件的原因。
gcnew	new generation的行为统计
gcnewcapacity	new generation及其对应空间的大小统计。
gcold	old和permanent generation的行为统计。
gcoldcapacity	old generation的大小统计。
gcpermcapacity	permanent generation的大小统计。
gcutil	垃圾回收统计的摘要信息。
printcompilation	HotSpot汇编方法统计。
-h n
每过n个样例(输出行)就显示一个列头,n为一个正整数。默认值为0,即只在数据的第一行上面显示列头。
-t n
显示时间戳列,并作为输出的第一个列。该时间戳表示目标JVM启动时间到当前时间的间隔时间。
-JjavaOption
传递javaOption到java应用启动程序。例如:-J-Xms48m设置启动内存为48MB。想要了解完整的选项列表,请参考下列文档:
java - the Java application launcher (Solaris)
java - the Java application launcher (Linux)
java - the Java application launcher (Windows)
STATOPTIONS和输出

下列表格概括了jstat为每个statOption输出的列。

-class选项

类加载器的统计信息
列	描述
Loaded	加载的类的数量
Bytes	加载的Kbyte数
Unloaded	已卸载的类的数量
Bytes	已卸载的Kbyte数
Time	执行类的加载和卸载操作所耗费的时间
-compiler选项

HotSpot即时(Just-In-Time)编译器的统计信息
列	描述
Compiled	已执行的编译任务数
Failed	失败的编译任务数
Invalid	无效的编译任务数
Time	执行编译任务所耗费的时间
FailedType	最后失败的编译的编译类型
FailedMethod	最后失败的编译的类名和方法
-gc选项

垃圾回收堆的统计信息
列	描述
S0C	survivor space 0的当前容量(KB).
S1C	survivor space 1的当前容量(KB).
S0U	survivor space 0使用的容量(KB).
S1U	survivor space 1使用的容量(KB).
EC	Eden space的当前容量(KB).
EU	Edenspace的已用容量(KB).
OC	Oldspace的当前容量(KB).
OU	Old space的已用容量(KB).
PC	Permanent space的当前容量(KB).
PU	Permanentspace的已用容量(KB).
YGC	Younggeneration的GC事件数量
YGCT	Younggeneration的垃圾回收事件
FGC	Full GC事件的数量
FGCT	Full GC的时间
GCT	总计的垃圾回收时间
-gccapacity选项

内存池的分代和空间容量Memory Pool Generation and Space Capacities
Column	Description
NGCMN	newgeneration的最小容量(KB).
NGCMX	newgeneration的最大容量(KB).
NGC	newgeneration的当前容量(KB).
S0C	survivor space 0的当前容量(KB).
S1C	survivor space 1的当前容量(KB).
EC	Eden space的当前容量(KB).
OGCMN	Old generation的最小容量(KB).
OGCMX	Oldgeneration的最大容量(KB).
OGC	Oldgeneration的当前容量(KB).
OC	Old space的当前容量(KB).
PGCMN	Permanentgeneration的最小容量(KB).
PGCMX	Permanentgeneration的最大容量(KB).
PGC	Permanentgeneration的当前容量(KB).
PC	Permanent space的当前容量(KB).
YGC	Younggeneration的GC事件数
FGC	Full GC事件的数量
-gccause选项

此选项显示与-gcutil选项相同的垃圾回收统计摘要信息,但却包括最后的和当前的(如适用)垃圾回收事件的原因。除了-gcutil列出的列,此选项还添加了以下列:

垃圾回收统计,包括GC事件
列	描述
LGCC	最后的垃圾回收的原因
GCC	当前的垃圾回收的原因
-gcnew选项

新生代(New)的统计信息
列	描述
S0C	survivor space 0的当前容量(KB).
S1C	survivor space 1的当前容量(KB).
S0U	survivor space 0的已用容量(KB).
S1U	survivor space 1的已用容量(KB).
TT	期限阈值
MTT	最大的期限阈值
DSS	所需的幸存者(survivor)大小(KB).
EC	Eden space的当前容量(KB).
EU	Eden space的已用容量(KB).
YGC	Young generation的GC事件数
YGCT	Young generation的垃圾回收时间
-gcnewcapacity选项

新生代(new)的空间大小统计
列	描述
NGCMN           
new generation的最小容量(KB). 
NGCMX    	new generation的最大容量(KB).
NGC    	new generation的当前容量(KB).
S0CMX	survivor space 0的最大容量(KB).
S0C	survivor space 0的当前容量(KB).
S1CMX	survivor space 1的最大容量(KB).
S1C	survivor space 1的当前容量(KB).
ECMX	Eden space的最小容量(KB).
EC	Eden space的当前容量(KB).
YGC	Young generation的GC事件数
FGC	Full GC事件的数量
-gcold选项

Old和Permanent Generation的统计信息
列	描述
PC	permanent space的当前容量(KB).
PU	Permanent space的已用容量(KB).
OC	old space的当前容量(KB).
OU	old space的已用容量(KB).
YGC	young generation的GC事件数
FGC	Full GC事件的数量
FGCT	Full GC的时间
GCT	总计的垃圾回收时间
-gcoldcapacity选项

Old Generation的统计信息
列	描述
OGCMN	old generation的最小容量(KB).
OGCMX	old generation的最大容量(KB).
OGC	old generation的当前容量(KB).
OC	old space的当前容量(KB).
YGC	young generation的GC事件数
FGC	Full GC事件的数量
FGCT	Full GC的时间
GCT	总计的垃圾回收时间
-gcpermcapacity选项

Permanent Generation的统计信息
列	描述
PGCMN	permanent generation的最小容量(KB).
PGCMX	permanent generation的最大容量(KB).
PGC	permanent generation的当前容量(KB).
PC	permanent space的当前容量(KB).
YGC	young generation的GC事件数
FGC	Full GC 事件的数量
FGCT	Full  GC的时间
GCT	总计的垃圾回收时间
-gcutil选项

垃圾回收统计的摘要信息
列	描述
S0	Survivor space 0已用容量占当前容量的百分比
S1	Survivor space 1已用容量占当前容量的百分比
E	Eden space已用容量占当前容量的百分比
O	Old space已用容量占当前容量的百分比
P	Permanent space已用容量占当前容量的百分比
YGC	young generation的GC事件数
YGCT	Young generation的垃圾回收时间
FGC	Full GC 事件的数量
FGCT	Full GC的时间
GCT	总计的垃圾回收时间
-printcompilation选项

HotSpot编译器方法统计
列	描述
Compiled	已执行的编译任务数
Size	方法字节码的字节数
Type	编译类型
Method	表示被编译方法的类名和方法名。类名使用"/"替代"."作为命名空间的分隔符。方法名是给定的类的方法。这两个字段的格式与HotSpot选项- XX:+PrintComplation是一致的。
示例

本节介绍监控lvmid为21891的本地JVM的几个示例。

使用gcutil选项

本示例附于lvmid 21891,每过250毫秒获取7个样本,并指定-gcutil选项来显示输出。

jstat -gcutil 21891 250 7
  S0     S1     E      O      P     YGC    YGCT    FGC    FGCT     GCT
 12.44   0.00  27.20   9.49  96.70    78    0.176     5    0.495    0.672
 12.44   0.00  62.16   9.49  96.70    78    0.176     5    0.495    0.672
 12.44   0.00  83.97   9.49  96.70    78    0.176     5    0.495    0.672
  0.00   7.74   0.00   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  23.37   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  43.82   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  58.11   9.51  96.71    79    0.177     5    0.495    0.673
该示例的输出表明,第3和第4个样本之间发生了一个young generation的垃圾回收。此次回收耗费0.001秒,并将eden space(E)的对象推进到old space(O),结果使得old space的已用容量从9.49%增加到9.51%。在回收之前,survivor space使用了12.44%,但在回收之后,仅使用了7.74%。

重复列的标题字符串

本示例附于lvmid 21891,每过250毫秒获取一次样本,并指定-gcutil选项来显示输出。此外,它使用-h3选项来实现每显示3行数据之后输出一次列标题。

jstat -gcnew -h3 21891 250
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
  64.0   64.0    0.0   31.7 31  31   32.0    512.0    178.6    249    0.203
  64.0   64.0    0.0   31.7 31  31   32.0    512.0    355.5    249    0.203
  64.0   64.0   35.4    0.0  2  31   32.0    512.0     21.9    250    0.204
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
  64.0   64.0   35.4    0.0  2  31   32.0    512.0    245.9    250    0.204
  64.0   64.0   35.4    0.0  2  31   32.0    512.0    421.1    250    0.204
  64.0   64.0    0.0   19.0 31  31   32.0    512.0     84.4    251    0.204
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
  64.0   64.0    0.0   19.0 31  31   32.0    512.0    306.7    251    0.204
除了显示重复的标题字符串,此示例还显示,在第2和第3个样本之间,发生了一次young GC。它耗费了0.001秒。此次回收发现了足够多的活跃数据,survivor space 0的使用空间(S0U)已经超过所需的survivor大小(DSS)。结果,对象被推进old generation(本次输出中不可见),期限阈值(TT)从31降到2。
第5和第6个样本之间发生了另一次垃圾回收。此次回收只发现了少许的survivor,期限阈值又返回到了31。

每个样本包含一个时间戳

本示例附于lvmid 21891,并且每过250毫秒就提取3个样本。选项-t用来为每个样本在第一列生成一个时间戳。

jstat -gcoldcapacity -t 21891 250 3
Timestamp          OGCMN        OGCMX         OGC           OC       YGC   FGC    FGCT    GCT
          150.1       1408.0      60544.0      11696.0      11696.0   194    80    2.874   3.799
          150.4       1408.0      60544.0      13820.0      13820.0   194    81    2.938   3.863
          150.7       1408.0      60544.0      13820.0      13820.0   194    81    2.938   3.863
Timestamp列报告了自目标虚拟机启动以后所消逝的时间,单位是秒。此外, 选项-gcoldcapacity显示,为了满足分配或提升的需求,old generation的容量(OGC)和old space的容量(OC)随着堆的扩张而增加。在第81次Full GC(FGC)之后,old generation的容量(OGC)从11696KB增长到13820KB。generation(和space)的最大容量为60544KB(OGCMX),因此它仍然有扩张的空间。
监控远程JVM

本示例附于名为remote.domain的系统的lvmid 40496,使用-gcutil选项,并且无限期地每秒获取一次样本。

jstat -gcutil 40496@remote.domain 1000
...省略输出
lvmid与远程主机的名称结合,构成了一个lvmid -- 40496@remote.domain。该vmid导致使用rmi协议来与远程主机的默认jstatd服务器进行通讯。jstatd服务器位于remote.domain之上,并使用绑定默认rmiregistry端口号(1099)的rmiregistry。

 

jstated命令

jstatd,即虚拟机的jstat守护进程,主要用于监控JVM的创建与终止,并提供一个接口允许远程监控工具依附到在本地主机上运行的JVM。

用法摘要

jstatd [ options ]
options
命令行选项。这些选项可以是任意顺序。如果存在多余的或者自相矛盾的选项,则优先考虑最后的选项。
描述

jstatd工具是一个RMI服务器应用程序,主要用于监控HotSpot Java 虚拟机的创建与终止,并提供一个接口以允许远程监控工具附加到本地主机上运行的JVM上。

jstatd服务器需要在本地主机上存在一个RMI注册表。jstatd服务器将尝试在默认端口或-p port选项指定的端口附加到该RMI注册表上。如果RMI注册表不存在,jstatd应用程序将会自动创建一个,并绑定到-p port选项指定的端口上,如果省略了-p port选项,则绑定到默认的RMI注册表端口。你可以通过指定-nr选项来抑制内部RMI注册表的创建。

注意:此工具是不受支持的,并且无法确定在未来版本的JDK中是否可用。目前,此工具不适用于Windows 98和Windows ME平台。
选项

jstatd命令支持以下选项:

-nr
当找不到现有的RMI注册表时,不尝试使用jstatd进程创建一个内部的RMI注册表。
-p  port
在指定的端口查找RMI注册表。如果没有找到,并且没有指定-nr选项,则在该端口自行创建一个内部的RMI注册表。
-n  rminame
RMI注册表中绑定的RMI远程对象的名称。默认的名称为JStatRemoteHost。如果多个jstatd服务器在同一主机上运行,你可以通过指定该选项来让每个服务器导出的RMI对象具有唯一的名称。不管如何,这样做需要将唯一的服务器名称包含进监控客户端的hostid和vmid字符串中。
-Joption
将选项参数传递给被javac调用的java启动程序。例如,-J-Xms48m设置启动内存为48 MB。使用-J将选项参数传递给执行Java应用程序的底层虚拟机,这是一种常见惯例。
安全性

jstatd只能够监控具有适当的本地访问权限的JVM。因此,jstatd进程必须以与目标JVM相同的用户凭证来运行。某些用户凭据,例如基于Unix系统的root用户,有权限访问系统中任何JVM导出的instrumentation。以此凭据运行的jstatd进程可以监控系统上的任何JVM,但会引入一些额外的安全隐患。

jstatd服务器不提供远程客户端的任何授权许可。因此,通过那些jstatd进程有权访问网络中任何用户的所有JVM,运行jstatd进程会暴露instrumentation出口。这种接触可能不是你的当前环境所想要的;在启动jstatd进程之前,尤其是和生产环境或者非安全的网络中,你应该考虑本地的安全策略。

如果没有安装其他的安全管理器,jstatd服务器会安装一个RMISecurityPolicy的实例,因此需要指定一个安全策略文件。策略文件必须遵循该默认策略实现的策略文件语法。

下列策略文件将允许jstatd服务器在没有任何安全例外的情况下运行。该策略没有授权所有权限给所有代码库那么自由,但却比授予最小的权限来运行jstatd服务器更自由。

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};
为了使用此策略,请复制上述文本到一个名叫jstatd.all.policy的文件中,并使用如下命令运行jstatd服务器:

jstatd -J-Djava.security.policy=jstatd.all.policy
对于具有更严格的安全实践的网络场所而言,可能使用一个自定义的策略文件来显示对特定的可信主机或网络的访问,尽管这种技术容易受到IP地址欺诈攻击。 如果你的安全问题无法使用一个定制的策略文件来处理,那么最安全的操作是不运行jstatd服务器,而是在本地使用jstat和jps工具。

远程接口

jstatd进程输出的接口是私有的,并会产生变化。不鼓励用户和开发者往此接口写入数据。

示例

这里有一些启动jstatd的示例。注意,jstatd脚本会自动在后台启动服务器。

使用内部的RMI注册表

本示例演示启动jstatd,并使用内部RMI注册表。本示例假定没有其它服务器绑定到默认的RMI注册表端口(端口号 1099)。

jstatd -J-Djava.security.policy=all.policy
使用外部的RMI注册表

本示例演示启动jstatd,并使用外部RMI注册表。

rmiregistry&
jstatd -J-Djava.security.policy=all.policy
本示例演示启动jstatd,并使用端口2020上的外部RMI注册表。

rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020
本示例演示启动jstatd,并使用端口2020上的外部RMI注册表,绑定的RMI远程对象名称为AlternateJstatdServerName。

rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
抑制进程中的RMI注册表的创建

本示例演示启动jstatd,而且即使找不到现有的RMI注册表,也不会创建一个新的RMI注册表。本示例假定已经有一个RMI注册表在运行中。如果没有,则发出适当的错误信息。

jstatd -J-Djava.security.policy=all.policy -nr
启动RMI日志能力

本示例演示启动jstatd,并启用RMI日志功能。该技术对于故障排除的援助或者监控服务器活动非常有用。

jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true

 

jinfo命令

jinfo(Java Configuration Information),主要用于查看指定Java进程(或核心文件、远程调试服务器)的Java配置信息。

用法摘要

#指定进程号(pid)的进程
jinfo [ option ] pid
#指定核心文件
jinfo [ option ] <executable <core>
#指定远程调试服务器
jinfo [ option ] [server-id@]<remote-hostname-or-IP>
参数

option
选项参数是互斥的(不可同时使用)。想要使用选项参数,直接跟在命令名称后即可。
pid
需要打印配置信息的进程ID。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。
executable
产生核心dump的Java可执行文件。
core
需要打印配置信息的核心文件。
remote-hostname-or-IP
远程调试服务器的(请查看jsadebugd)主机名或IP地址。
server-id
可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
描述

jinfo用于打印指定Java进程、核心文件或远程调试服务器的Java配置信息。配置信息包括Java系统属性、Java虚拟机命令行标识参数。如果给定的进程运行于64位的虚拟机上,你可能需要使用指定-J-d64选项,例如:

jinfo -J-d64 -sysprops pid
注意 - 此工具是不受支持的,不确定在未来版本的JDK中是否可用。在不存在dbgeng.dll的Windows系统中,需要安装'Windows调试工具',才能让这些工具工作。另外,PATH环境变量应该包含目标进程或Crash Dump文件产生目录使用的jvm.dll的路径。

例如,set PATH=<jdk>\jre\bin\client;%PATH%。
选项

<no option>
打印命令行标识参数和系统属性键值对。
-flag name
打印指定的命令行标识参数的名称和值。
-flag [+|-]name
启用或禁用指定的boolean类型的命令行标识参数。
-flag name=value
为给定的命令行标识参数设置指定的值。
-flags
成对打印传递给JVM的命令行标识参数。
-sysprops
以键值对形式打印Java系统属性。
-h
打印帮助信息。
-help
打印帮助信息。

 

jhat 命令

jhat(Java Heap Analysis Tool),是JDK自带的Java堆内存分析工具。

用法摘要

jhat的命令行用法如下:

jhat [ options ] <heap-dump-file>
参数

options
选项参数.如果使用,请直接跟在命令名称之后。
heap-dump-file
指定用于浏览的Java二进制heap dump文件。对于一个包含多个heap dump的dump文件,你可以在文件名称后面追加"#<number>"来指定文件中的某个dump,例如:foo.hprof#3。
描述

jhat命令解析一个java heap dump文件并启动一个web服务器。jhat使得你可以使用自己喜欢的web浏览器浏览heap dump。jhat支持预先设计的查询语言(例如'show all instances of a known class "Foo"')以及OQL(对象查询语言) -- 一种用于查询heap dump的、类似于SQL的查询语言。你可以通过jhat显示的OQL帮助页面查看关于OQL的帮助信息。在使用默认端口的情况下,OQL的帮助信息位于http://localhost:7000/oqlhelp/。

有以下几种方式可以生成一个Java heap dump:

使用jmap -dump选项获取一个运行时的heap dump。
使用jconsole选项通过运行时的HotSpotDiagnosticMXBean获取一个heap dump。
通过指定-XX:+HeapDumpOnOutOfMemoryErrorVM选项,在抛出OutOfMemoryError错误时,将会生成一个heap dump。
使用hprof。
注意:此工具具有实验性质的,并不保证在未来版本的JDK中可用。

选项

-stack false/true
关闭跟踪对象分配调用堆栈。注意,如果heap dump中的分配位置信息不可用,你必须设置此标识为false。此选项的默认值为true。
-refs false/true
关闭对象的引用跟踪。默认为true。默认情况下,反向指针(指向给定对象的对象,又叫做引用或外部引用)用于计算堆中的所有对象.
-port port-number
设置jhat的HTTP服务器的端口号。默认为7000。
-exclude exclude-file
指定一个数据成员列表的文件,这些数据成员将被排除在"reachable objects"查询的范围之外。举个例子,如果文件列有java.lang.String.value,那么,当计算指定对象"o"的可达对象列表时,涉及到java.lang.String.value字段的引用路径将会被忽略掉。

-baseline baseline-dump-file
指定一个基线heap dump。在两个heap dump(当前heap dump和基线heap dump)中存在相同对象ID的对象,不会被标记为"new"。其他的对象将被标记为"new"。这在比较两个不同的heap dump时非常有用。
-debug int
设置此工具的调试级别。0意味着没有调试输出。设置的值越高,输出的信息就越详细。
-version 
报告版本号并退出。
-h
输出帮助信息并退出。
-help 
输出帮助信息并退出。
-J<flag> 
将运行时参数传递给运行jhat的JVM。例如,-J-Xmx512m设置使用的最大堆内存大小为512MB。

 

 jmap命令

jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。

用法摘要

#指定进程号(pid)的进程
jmap [ option ] <pid>
#指定核心文件
jmap [ option ] <executable <core>
#指定远程调试服务器
jmap [ option ] [server-id@]<remote-hostname-or-IP>
参数

option
选项参数是互斥的(不可同时使用)。想要使用选项参数,直接跟在命令名称后即可。
pid
需要打印配置信息的进程ID。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。
executable
产生核心dump的Java可执行文件。
core
需要打印配置信息的核心文件。
remote-hostname-or-IP
远程调试服务器的(请查看jsadebugd)主机名或IP地址。
server-id
可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
描述

jmap用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节。

如果给定的进程运行于64位的虚拟机上,你可能需要使用指定-J-d64选项,例如:

jmap -J-d64 -heap pid
注意 - 此工具是不受支持的,不确定在未来版本的JDK中是否可用。在不存在dbgeng.dll的Windows系统中,需要安装'Windows调试工具',才能让这些工具工作。另外,PATH环境变量应该包含目标进程或Crash Dump文件产生目录使用的jvm.dll的路径。

例如,set PATH=<jdk>\jre\bin\client;%PATH%。
选项

<no option>
如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。
-dump:[live,]format=b,file=<filename>
以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。
-finalizerinfo
打印等待终结的对象信息。
-heap
打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和generation wise heap usage。
-histo[:live]
打印堆的柱状图。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个'*'前缀。如果指定了live子选项,则只计算活动的对象。
-permstat
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
-F
强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。
-h
打印帮助信息。
-help
打印帮助信息。
-J<flag>
指定传递给运行jmap的JVM的参数。

 

jstack命令

jstack,是一个堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。

用法摘要

#指定进程号(pid)的进程
jstack [ option ] <pid>
#指定核心文件
jstack [ option ] <executable <core>
#指定远程调试服务器
jstack [ option ] [server-id@]<remote-hostname-or-IP>
参数

option
选项参数是互斥的(不可同时使用)。想要使用选项参数,直接跟在命令名称后即可。
pid
需要打印配置信息的进程ID。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。
executable
产生核心dump的Java可执行文件。
core
需要打印配置信息的核心文件。
remote-hostname-or-IP
远程调试服务器的(请查看jsadebugd)主机名或IP地址。
server-id
可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
描述

jstack打印给定Java进程或核心文件、远程调试服务器的Java线程的堆栈跟踪信息。对于每个Java帧而言,jstack将打印类名全称、方法名称、'bci'(byte code index/字节码索引)和行号中可用的信息。使用-m选项,jstack会打印随着'pc'(program counter/程序计数器)而变化的所有线程的Java帧和本地帧。对于每个本地帧而言, 将打印离'pc'最近的本地符号(如果可用的话)。C++ mangled names are not demangled.To demangle C++ names, the output of this command may be piped to c++filt. 
注意 - 此工具是不受支持的,无法确定在未来版本的JDK中是否可用。jstack目前不适用于Windows平台或Linux安腾平台。

选项

-m
打印混合模式(Java和本地C/C++帧)的堆栈跟踪信息。
-h
打印帮助信息。
-help
打印帮助信息。

 

 

后面的jconsole命令和jmc命令,jvisualvm命令都是图像界面的情况下,更加的直观,就不做过多的介绍。

 

参考连接:http://www.softown.cn/post/186.html

转载于:https://my.oschina.net/QAAQ/blog/833240

相关文章:

  • Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页
  • 简单实现UIlabel可复制功能
  • 大数据学习系列之五 ----- Hive整合HBase图文详解
  • REST开放接口生成文档工具之apidoc
  • 自建Maven仓库 - Artifactory
  • 微信管理
  • 推荐一个提升工作效率的小插件[intellij-postfix-templates]
  • 面试(1)
  • ios - 关于拖动手势简单应用场景
  • 第二课、GUI程序实例分析------------------狄泰软件学院
  • 第五课、Qt Creator 工程介绍------------------狄泰软件学院
  • PL/pgSQL RETURNS TABLE 例子
  • 贝塞尔曲线学习
  • 2007浙大复试上机考试题目2--统计字符
  • static作用(修饰函数、局部变量、全局变量)
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular6错误 Service: No provider for Renderer2
  • Create React App 使用
  • JAVA多线程机制解析-volatilesynchronized
  • jQuery(一)
  • Js基础知识(一) - 变量
  • Laravel5.4 Queues队列学习
  • mac修复ab及siege安装
  • MySQL数据库运维之数据恢复
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python学习之路16-使用API
  • Rancher如何对接Ceph-RBD块存储
  • vue2.0项目引入element-ui
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 安卓应用性能调试和优化经验分享
  • 分布式事物理论与实践
  • 类orAPI - 收藏集 - 掘金
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端知识点整理(待续)
  • 自定义函数
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​什么是bug?bug的源头在哪里?
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十八)三元表达式和列表解析
  • (转)原始图像数据和PDF中的图像数据
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ****Linux下Mysql的安装和配置
  • ..回顾17,展望18
  • .Net IOC框架入门之一 Unity
  • .NET 常见的偏门问题
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • @property python知乎_Python3基础之:property
  • [100天算法】-实现 strStr()(day 52)