zoukankan      html  css  js  c++  java
  • JVM性能调优监控工具jps、jstack、jmap、jhat、jstat等使用详解

    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内置工具使用

  • 相关阅读:
    Jenkins Pipeline Script from SCM应用
    Jenkins获取所有job
    Jenkins pipeline使用git共享库(ShareLibrary)
    Jenkins获取用户所属组
    PowerShell函数当做变量传递给另一个函数
    Jenkins input获取提交人
    Groovy Map排序
    Jenkins Pipeline使用File parameter
    Jenkins Active Parameters之Groovy Script(获取具有管理员权限的组+组成员)
    Android中C/C++的日志打印
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/8448292.html
Copyright © 2011-2022 走看看