JVM性能调优监控工具jps、jstack、jmap、jhat、jstat等使用详解

版权声明:本文为博主原创文章,未经博主允许不得转载,如需转载,请注明文章出处为 http://www.54tianzhisheng.cn/,否则考虑法律追究责任,谢谢合作! https://blog.csdn.net/tzs_1041218129/article/details/61630981

javap 和 javac

  • javac -verbose 类名.java
  • java -verbose 类名
  • javap -c 类名
  • javap -verbose 类名

javap -help

用法: javap

其中, 可能的选项包括:

-help –help -? 输出此用法消息

-version 版本信息

-v -verbose 输出附加信息

-l 输出行号和本地变量表

-public 仅显示公共类和成员

-protected 显示受保护的/公共类和成员

-package 显示程序包/受保护的/公共类
和成员 (默认)

-p -private 显示所有类和成员

-c 对代码进行反汇编

-s 输出内部类型签名

-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)

-constants 显示最终常量

-classpath 指定查找用户类文件的位置

-cp 指定查找用户类文件的位置

-bootclasspath 覆盖引导类文件的位置


javac -help

用法: javac

其中, 可能的选项包括:

-g 生成所有调试信息

-g:none 不生成任何调试信息

-g:{lines,vars,source} 只生成某些调试信息

-nowarn 不生成任何警告

-verbose 输出有关编译器正在执行的操作的消息

-deprecation 输出使用已过时的 API 的源位置

-classpath <路径> 指定查找用户类文件和注释处理程序的位置

-cp <路径> 指定查找用户类文件和注释处理程序的位置

-sourcepath <路径> 指定查找输入源文件的位置

-bootclasspath <路径> 覆盖引导类文件的位置

-extdirs <目录> 覆盖所安装扩展的位置

-endorseddirs <目录> 覆盖签名的标准路径的位置

-proc:{none,only} 控制是否执行注释处理和/或编译。

-processor [,,…] 要运行的注释处理程序的名称; 绕过默认的搜索进程

-processorpath <路径> 指定查找注释处理程序的位置

-parameters 生成元数据以用于方法参数的反射

-d <目录> 指定放置生成的类文件的位置

-s <目录> 指定放置生成的源文件的位置

-h <目录> 指定放置生成的本机标头文件的位置

-implicit:{none,class} 指定是否为隐式引用文件生成类文件

-encoding <编码> 指定源文件使用的字符编码

-source <发行版> 提供与指定发行版的源兼容性

-target <发行版> 生成特定 VM 版本的类文件

-profile <配置文件> 请确保使用的 API 在指定的配置文件中可用

-version 版本信息

-help 输出标准选项的提要

-A关键字[=值] 传递给注释处理程序的选项

-X 输出非标准选项的提要

-J<标记> 直接将 <标记> 传递给运行时系统

-Werror 出现警告时终止编译

@<文件名> 从文件读取选项和文件名


jps

用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。

使用jps时,如果没有指定hostid,它只会显示本地环境中所有的Java进程;如果指定了hostid,它就会显示指定hostid上面的java进程,不过这需要远程服务上开启了jstatd服务。

jps -help

usage: jps [-help]

   jps [-q] [-mlvV] [<hostid>]

Definitions:

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

-q:忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid。

-m:输出传递给main方法的参数,如果是内嵌的JVM则输出为null。

-l:输出完全的包名,应用主类名,jar的完全路径名

-v:输出传给jvm的参数

-V:输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flags=指定的文件)。

-J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。


jstack

jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式:

jstack [-l] pid

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

jstack -help

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)(当’jstack [-l] pid’没有相应的时候强制打印栈信息)
-m  to print both java and native frames (mixed mode)(打印java和native c/c++框架的所有栈信息.)
-l  long listing. Prints additional information about locks (长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.)
-h  or -help to print this help message (打印帮助信息)

jstat

Jstat 用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:

  • 类的加载及卸载情况
  • 查看新生代、老生代及持久代的容量及使用情况
  • 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
  • 查看新生代中Eden区及Survior区中容量及分配情况等

jstat -help

Usage:

jstat -help|-options

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:

An option reported by the -options option

Virtual Machine Identifier. A vmid takes
the following form:
[@[:]]
Where is the local vm identifier for the target
Java virtual machine, typically a process id; is
the name of the host running the target Java virtual machine;
and 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.

Number of samples between header lines.

Sampling interval. The following forms are allowed:
[“ms”|”s”]
Where is an integer and the suffix specifies the units as
milliseconds(“ms”) or seconds(“s”). The default units are “ms”.

Number of samples to take before terminating.

-J Pass directly to the runtime system.

参考文章

1、jstat命令详解

2、jstat命令(Java Virtual Machine Statistics Monitoring Tool)

3、http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html#class_option


jmap

打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。

可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法

jmap -histo pid

如果连用SHELL

jmap -histo pid>a.log

可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。

jmap -dump:format=b,file=outfile 3024

可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool),使用参见:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。

64位机上使用需要使用如下方式:

jmap -J-d64 -heap pid

jmap -help

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

参数说明

1)、options:

executable Java executable from which the core dump was produced.
(可能是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务

2)、基本参数:

-dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.

-finalizerinfo 打印正等候回收的对象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.

-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.

-h | -help 打印辅助信息

-J 传递参数给jmap启动的jvm.

pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.


jinfo

jinfo 可以输出并修改运行时的java 进程的opts。

用处比较简单,用于输出JAVA系统参数及命令行参数。

用法是 jinfo -opt pid

如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。

jinfo -help

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

jconsole

一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选则进程就可以了。

需要注意的就是在运行jconsole之前,必须要先设置环境变量DISPLAY,否则会报错误,Linux下设置环境变量如下:

export DISPLAY=:0.0

这里写图片描述

可以这里选择查看本地进程的状况,还是远程进程的状况

这里写图片描述

通过这张图可以看到内存、线程、类及CPU使用的一些情况。


jvisualvm

参考文章:

程序员必备利器—Java程序性能分析工具Java VisualVM(Visual GC)


jhat

用于对JAVA heap进行离线分析的工具,他可以对不同虚拟机中导出的heap信息文件进行分析,如Linux上导出的文件可以拿到WINDOWS上进行分析,可以查找诸如内存方面的问题,使用方式可以查看这篇文章:

jhat命令

不过jhat和MAT比较起来,就没有MAT那么直观了,MAT是以图形界面的方式展现结果,MAT的使用方式可以参看文章:

MAT(Memory Analyzer Tool)工具入门介绍

Usage:
jhat [-stack ] [-refs ] [-port ] [-baseline ] [-debug ] [-version] [-h|-help]

    -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

jdb

用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。


jstatd

jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。

jstatd是基于RMI的,所以在运行jstatd的服务器上必须存在RMI注册中心,如果没有通过选项”-p port”指定要连接的端口,jstatd会尝试连接RMI注册中心的默认端口。

用法:

jstatd [-nr] [-p port] [-n rminame]

-nr 如果RMI注册中心没有找到,不会创建一个内部的RMI注册中心。

-p port RMI注册中心的端口号,默认为1099。

-n rminame 默认为JStatRemoteHost;如果同一台主机上同时运行了多个jstatd服务,rminame可以用于唯一确定一个jstatd服务;这里需要注意一下,如果开启了这个选项,那么监控客户端远程连接时,必须同时指定hostid及vmid,才可以唯一确定要连接的服务,这个可以参看jps章节中列出远程服务器上Java进程的示例。

-J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。


参考文章

JDK内置工具使用

阅读更多
换一批

没有更多推荐了,返回首页