jvm 分析工具

jdk给我们提供了很多的工具,让我们检测运行中的程序,帮助我们更好的优化程序和发现问题。在网站找到了java命令学习系列这篇文章,很受启发,在此做一个信息的摘录,并加上自己的注释和理解。

  1. jps
    jdk中的jps命令可以显示当前运行的java进程以及相关参数,它的实现机制如下:java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/),有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。
➜  ~ jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

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

利用man命令查看一下可以跟的参数

OPTIONS
       The jps command supports a number of options that modify the output of
       the command. These options are subject to change or removal in the
       future.

       -q
              Suppresses the output of the class name, JAR file name, and
              arguments passed to the main method, producing only a list of
              local JVM identifiers.

       -m
              Displays the arguments passed to the main method. The output may
              be null for embedded JVMs.

       -l
              Displays the full package name for the application's main class
              or the full path name to the application's JAR file.

       -v
              Displays the arguments passed to the JVM.

       -V
              Suppresses the output of the class name, JAR file name, and
              arguments passed to the main method, producing only a list of
              local JVM identifiers.

       -Joption
              Passes option to the JVM, where option is one of the options
              described on the reference page for the Java application
              launcher. For example, -J-Xms48m sets the startup memory to 48
              MB. See java(1).

-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m 输出传递给main 方法的参数
-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
-v 输出传递给JVM的参数

  1. jstack
    jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

线程状态:想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:

NEW,未启动的。不会出现在Dump中。

RUNNABLE,在虚拟机内执行的。

BLOCKED,受阻塞并等待监视器锁。

WATING,无限期等待另一个线程执行特定操作。

TIMED_WATING,有时限的等待另一个线程的特定操作。

TERMINATED,已退出的。

Monitor
在多线程的 JAVA程序中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。下 面这个图,描述了线程和 Monitor之间关系,以 及线程的状态转换图:

image.png

解释说:

进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则迚入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。

拥有者(The Owner):表示某一线程成功竞争到对象锁。

等待区(Wait Set):表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。

从图中可以看出,一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。 先看 “Entry Set”里面的线程。我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。

线程状态产生的原因

runnable:状态一般为RUNNABLE。

in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。

waiting for monitor entry:进入区等待,状态为BLOCKED。

waiting on condition:等待区等待、被park。

sleeping:休眠的线程,调用了Thread.sleep()。

看一下命令吧:

➜  ~ jstack
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’没有相应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.
-h 打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.

  1. jstat
    jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。
➜  ~ jstat -help
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 — 选项,下面会介绍可以跟什么选项

vmid — VM的进程号,即当前运行的java进程号

interval– 间隔时间,单位为秒或者毫秒

count — 打印次数,如果缺省则打印无数次

对于命令格式中的VMID与LVMID需要特别说明下:如果是本地虚拟机进程,VMID(Virtual Machine IDentifier,虚机标识符)和LVMID(Local Virtual Machine IDentifier,虚机标识符)是一致的,如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//] lvmid [@hostname[:port]/servername]

利用man命令查看一下具体的参数

OPTIONS
       The jstat command supports two types of options, general options and
       output options. General options cause the jstat command to display
       simple usage and version information. Output options determine the
       content and format of the statistical output.

       All options and their functionality are subject to change or removal in
       future releases.

   General Options
       If you specify one of the general options, then you cannot specify any
       other option or parameter.

       -help
           Displays a help message.

       -options
           Displays a list of static options. See Output Options.

   Output Options
       If you do not specify a general option, then you can specify output
       options. Output options determine the content and format of the jstat
       command's output, and consist of a single statOption, plus any of the
       other output options (-h, -t, and -J). The statOption must come first.

       Output is formatted as a table, with columns that are separated by
       spaces. A header row with titles describes the columns. Use the -h
       option to set the frequency at which the header is displayed. Column
       header names are consistent among the different options. In general, if
       two options provide a column with the same name, then the data source
       for the two columns is the same.

       Use the -t option to display a time stamp column, labeled Timestamp as
       the first column of output. The Timestamp column contains the elapsed
       time, in seconds, since the target JVM started. The resolution of the
       time stamp is dependent on various factors and is subject to variation
       due to delayed thread scheduling on heavily loaded systems.

       Use the interval and count parameters to determine how frequently and
       how many times, respectively, the jstat command displays its output.

       Note: Do not to write scripts to parse the jstat command's output
       because the format might change in future releases. If you write
       scripts that parse jstat command output, then expect to modify them for
       future releases of this tool.

       -statOption
           Determines the statistics information the jstat command displays.
           The following lists the available options. Use the -options general
           option to display the list of options for a particular platform
           installation. See Stat Options and Output.

           class: Displays statistics about the behavior of the class loader.

           compiler: Displays statistics about the behavior of the Java
           HotSpot VM Just-in-Time compiler.

           gc: Displays statistics about the behavior of the garbage collected
           heap.

           gccapacity: Displays statistics about the capacities of the
           generations and their corresponding spaces.

           gccause: Displays a summary about garbage collection statistics
           (same as -gcutil), with the cause of the last and current (when
           applicable) garbage collection events.

           gcnew: Displays statistics of the behavior of the new generation.

           gcnewcapacity: Displays statistics about the sizes of the new
           generations and its corresponding spaces.

           gcold: Displays statistics about the behavior of the old generation
           and metaspace statistics.

           gcoldcapacity: Displays statistics about the sizes of the old
           generation.

           gcmetacapacity: Displays statistics about the sizes of the
           metaspace.

           gcutil: Displays a summary about garbage collection statistics.

           printcompilation: Displays Java HotSpot VM compilation method
           statistics.

       -h n
           Displays a column header every n samples (output rows), where n is
           a positive integer. Default value is 0, which displays the column
           header the first row of data.

       -t
           Displays a timestamp column as the first column of output. The time
           stamp is the time since the start time of the target JVM.

       -JjavaOption
           Passes javaOption to the Java application launcher. For example,
           -J-Xms48m sets the startup memory to 48 MB. For a complete list of
           options, see java(1).

   Stat Options and Output
       The following information summarizes the columns that the jstat command
       outputs for each statOption.

       -class option
           Class loader statistics.

           Loaded: Number of classes loaded.

           Bytes: Number of kBs loaded.

           Unloaded: Number of classes unloaded.

           Bytes: Number of Kbytes unloaded.

           Time: Time spent performing class loading and unloading operations.

       -compiler option
           Java HotSpot VM Just-in-Time compiler statistics.

           Compiled: Number of compilation tasks performed.

           Failed: Number of compilations tasks failed.

           Invalid: Number of compilation tasks that were invalidated.

           Time: Time spent performing compilation tasks.

           FailedType: Compile type of the last failed compilation.

           FailedMethod: Class name and method of the last failed compilation.

       -gc option
           Garbage-collected heap statistics.

           S0C: Current survivor space 0 capacity (kB).

           S1C: Current survivor space 1 capacity (kB).

           S0U: Survivor space 0 utilization (kB).

           S1U: Survivor space 1 utilization (kB).

           EC: Current eden space capacity (kB).

           EU: Eden space utilization (kB).

           OC: Current old space capacity (kB).

           OU: Old space utilization (kB).

           MC: Metaspace capacity (kB).

           MU: Metacspace utilization (kB).

           CCSC: Compressed class space capacity (kB).

           CCSU: Compressed class space used (kB).

           YGC: Number of young generation garbage collection events.

           YGCT: Young generation garbage collection time.

           FGC: Number of full GC events.

           FGCT: Full garbage collection time.

           GCT: Total garbage collection time.

       -gccapacity option
           Memory pool generation and space capacities.

           NGCMN: Minimum new generation capacity (kB).

           NGCMX: Maximum new generation capacity (kB).

           NGC: Current new generation capacity (kB).

           S0C: Current survivor space 0 capacity (kB).

           S1C: Current survivor space 1 capacity (kB).

           EC: Current eden space capacity (kB).

           OGCMN: Minimum old generation capacity (kB).

           OGCMX: Maximum old generation capacity (kB).

           OGC: Current old generation capacity (kB).

           OC: Current old space capacity (kB).

           MCMN: Minimum metaspace capacity (kB).

           MCMX: Maximum metaspace capacity (kB).

           MC: Metaspace capacity (kB).

           CCSMN: Compressed class space minimum capacity (kB).

           CCSMX: Compressed class space maximum capacity (kB).

           CCSC: Compressed class space capacity (kB).

           YGC: Number of young generation GC events.

           FGC: Number of full GC events.

       -gccause option
           This option displays the same summary of garbage collection
           statistics as the -gcutil option, but includes the causes of the
           last garbage collection event and (when applicable) the current
           garbage collection event. In addition to the columns listed for
           -gcutil, this option adds the following columns.

           LGCC: Cause of last garbage collection

           GCC: Cause of current garbage collection

       -gcnew option
           New generation statistics.

           S0C: Current survivor space 0 capacity (kB).

           S1C: Current survivor space 1 capacity (kB).

           S0U: Survivor space 0 utilization (kB).

           S1U: Survivor space 1 utilization (kB).

           TT: Tenuring threshold.

           MTT: Maximum tenuring threshold.

           DSS: Desired survivor size (kB).

           EC: Current eden space capacity (kB).

           EU: Eden space utilization (kB).

           YGC: Number of young generation GC events.

           YGCT: Young generation garbage collection time.

       -gcnewcapacity option
           New generation space size statistics.

           NGCMN: Minimum new generation capacity (kB).

           NGCMX: Maximum new generation capacity (kB).

           NGC: Current new generation capacity (kB).

           S0CMX: Maximum survivor space 0 capacity (kB).

           S0C: Current survivor space 0 capacity (kB).

           S1CMX: Maximum survivor space 1 capacity (kB).

           S1C: Current survivor space 1 capacity (kB).

           ECMX: Maximum eden space capacity (kB).

           EC: Current eden space capacity (kB).

           YGC: Number of young generation GC events.

           FGC: Number of full GC events.

       -gcold option
           Old generation and metaspace behavior statistics.

           MC: Metaspace capacity (kB).

           MU: Metaspace utilization (kB).

           CCSC: Compressed class space capacity (kB).

           CCSU: Compressed class space used (kB).

           OC: Current old space capacity (kB).

           OU: Old space utilization (kB).

           YGC: Number of young generation GC events.

           FGC: Number of full GC events.

           FGCT: Full garbage collection time.

           GCT: Total garbage collection time.

       -gcoldcapacity option
           Old generation size statistics.

           OGCMN: Minimum old generation capacity (kB).

           OGCMX: Maximum old generation capacity (kB).

           OGC: Current old generation capacity (kB).

           OC: Current old space capacity (kB).

           YGC: Number of young generation GC events.

           FGC: Number of full GC events.

           FGCT: Full garbage collection time.

           GCT: Total garbage collection time.

       -gcmetacapacity option
           Metaspace size statistics.

           MCMN: Minimum metaspace capacity (kB).

           MCMX: Maximum metaspace capacity (kB).

           MC: Metaspace capacity (kB).

           CCSMN: Compressed class space minimum capacity (kB).

           CCSMX: Compressed class space maximum capacity (kB).

           YGC: Number of young generation GC events.

           FGC: Number of full GC events.

           FGCT: Full garbage collection time.

           GCT: Total garbage collection time.

       -gcutil option
           Summary of garbage collection statistics.

           S0: Survivor space 0 utilization as a percentage of the space's
           current capacity.

           S1: Survivor space 1 utilization as a percentage of the space's
           current capacity.

           E: Eden space utilization as a percentage of the space's current
           capacity.

           O: Old space utilization as a percentage of the space's current
           capacity.

           M: Metaspace utilization as a percentage of the space's current
           capacity.

           CCS: Compressed class space utilization as a percentage.

           YGC: Number of young generation GC events.

           YGCT: Young generation garbage collection time.

           FGC: Number of full GC events.

           FGCT: Full garbage collection time.

           GCT: Total garbage collection time.

       -printcompilation option
           Java HotSpot VM compiler method statistics.

           Compiled: Number of compilation tasks performed by the most
           recently compiled method.

           Size: Number of bytes of byte code of the most recently compiled
           method.

           Type: Compilation type of the most recently compiled method.

           Method: Class name and method name identifying the most recently
           compiled method. Class name uses slash (/) instead of dot (.) as a
           name space separator. Method name is the method within the
           specified class. The format for these two fields is consistent with
           the HotSpot -XX:+PrintCompilation option.

option
选项option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:

–class 监视类装载、卸载数量、总空间及类装载所耗费的时间 
–gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量 
–gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间 
–gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 
–gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 –gcnew 监视新生代GC的状况 
–gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间 
–gcold 监视老年代GC的状况 
–gcoldcapacity 监视内容与——gcold基本相同,输出主要关注使用到的最大和最小空间 
–gcpermcapacity 输出永久代使用到的最大和最小空间 
–compiler 输出JIT编译器编译过的方法、耗时等信息
–printcompilation 输出已经被JIT编译的方法

常见术语

1、jstat –class<pid> : 显示加载class的数量,及所占空间等信息。

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

2、jstat -compiler <pid>显示VM实时编译的数量等信息。

Compiled 编译任务执行数量 
Failed 编译任务执行失败数量 
Invalid 编译任务执行失效数量 
Time 编译任务消耗时间 
FailedType 最后一个编译失败任务的类型 
FailedMethod 最后一个编译失败任务所在的类及方法

3、jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。

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

4、jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小

NGCMN 年轻代(young)中初始化(最小)的大小(字节) 
NGCMX 年轻代(young)的最大容量 (字节) 
NGC 年轻代(young)中当前的容量 (字节) 
S0C 年轻代中第一个survivor(幸存区)的容量 (字节) 
S1C 年轻代中第二个survivor(幸存区)的容量 (字节) 
EC 年轻代中Eden(伊甸园)的容量 (字节) 
OGCMN old代中初始化(最小)的大小 (字节) 
OGCMX old代的最大容量(字节) 
OGC old代当前新生成的容量 (字节) 
OC Old代的容量 (字节) 
PGCMN perm代中初始化(最小)的大小 (字节) 
PGCMX perm代的最大容量 (字节)
PGC perm代当前新生成的容量 (字节) 
PC Perm(持久代)的容量 (字节) 
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数

5、jstat -gcutil <pid>:统计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)

6、jstat -gcnew <pid>:年轻代对象的信息。

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

7、jstat -gcnewcapacity<pid>: 年轻代对象的信息及其占用量。

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

8、jstat -gcold <pid>:old代对象的信息。

PC Perm(持久代)的容量 (字节) 
PU Perm(持久代)目前已使用空间 (字节) 
OC Old代的容量 (字节) 
OU Old代目前已使用空间 (字节) 
YGC 从应用程序启动到采样时年轻代中gc次数 
FGC 从应用程序启动到采样时old代(全gc)gc次数 
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) 
GCT 从应用程序启动到采样时gc用的总时间(s)

9、stat -gcoldcapacity <pid>: old代对象的信息及其占用量。

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

10、jstat -gcpermcapacity<pid>: perm对象的信息及其占用量。

PGCMN perm代中初始化(最小)的大小 (字节) 
PGCMX perm代的最大容量 (字节)
PGC perm代当前新生成的容量 (字节) 
PC Perm(持久代)的容量 (字节) 
YGC 从应用程序启动到采样时年轻代中gc次数 
FGC 从应用程序启动到采样时old代(全gc)gc次数 
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) 
GCT 从应用程序启动到采样时gc用的总时间(s)

11、jstat -printcompilation <pid>:当前VM执行的信息。

Compiled 编译任务的数目 
Size 方法生成的字节码的大小 
Type 编译类型 
Method 类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。
上述格式是由-XX:+PrintComplation选项进行设置的
  1. jmap
    jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息虚拟机属性完整的线程Dump所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况.常见内存错误:
outOfMemoryError 年老代内存不足。
outOfMemoryError:PermGen Space 永久代内存不足。
outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。

用法摘要

➜  ~ jmap
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。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。
executable 产生核心dump的Java可执行文件。
core 需要打印配置信息的核心文件。
remote-hostname-or-IP 远程调试服务器的(请查看jsadebugd)主机名或IP地址。
server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。

选项解释

<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的参数。

查看java 堆(heap)使用情况,执行命令:

jmap -heap 31846

Attaching to process ID 31846, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)//GC 方式

Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize      = 2082471936 (1986.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize          = 1310720 (1.25MB)//对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize       = 17592186044415 MB//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize          = 5439488 (5.1875MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio         = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio    = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 
   PermSize         = 21757952 (20.75MB)  //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
   MaxPermSize      = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage://堆内存使用情况
PS Young Generation
Eden Space://Eden区内存分布
   capacity = 33030144 (31.5MB)//Eden区总容量
   used     = 1524040 (1.4534378051757812MB)  //Eden区已使用
   free     = 31506104 (30.04656219482422MB)  //Eden区剩余容量
   4.614088270399305% used //Eden区使用比率
From Space:  //其中一个Survivor区的内存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:  //另一个Survivor区的内存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation //当前的Old区内存分布
   capacity = 86507520 (82.5MB)
   used     = 0 (0.0MB)
   free     = 86507520 (82.5MB)
   0.0% used
PS Perm Generation//当前的 “永生代” 内存分布
   capacity = 22020096 (21.0MB)
   used     = 2496528 (2.3808746337890625MB)
   free     = 19523568 (18.619125366210938MB)
   11.337498256138392% used

670 interned Strings occupying 43720 bytes.

查看堆内存(histogram)中的对象数量及大小,执行命令:

jmap -histo 3331

num     #instances         #bytes  class name
编号     个数                字节     类名
----------------------------------------------
   1:             7        1322080  [I
   2:          5603         722368  <methodKlass>
   3:          5603         641944  <constMethodKlass>
   4:         34022         544352  java.lang.Integer
   5:           371         437208  <constantPoolKlass>
   6:           336         270624  <constantPoolCacheKlass>
   7:           371         253816  <instanceKlassKlass>

jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。

将内存使用的详细情况输出到文件,执行命令:

jmap -dump:format=b,file=heapDump 6900

然后用jhat命令可以参看 jhat -port 5000 heapDump 在浏览器中访问:http://localhost:5000/ 查看详细信息,这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

5.jhat
jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。之前的文章讲到过,使用可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。看一下命令

➜  ~ jhat -help
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"

说明:

-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

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

-J< flag >

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

如何生成dump文件

1. jmap : jmap -dump:format=b,file=heapDump 62247
2. 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)
3. 虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。
4. 使用 hprof 命令

针对生成的堆dump文件,除了jhat处理外,还可以通过eclipse的插件mat来操作。

本文更多的是摘录,也是自己的记录,共勉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容