JVM排查命令概览

  1. jps:查看运行中java进程pid
  2. jinfo:查看jvm运行参数
  3. jmap:用于查看JVM各个区域的使用情况,还可以生成dump镜像
  4. jstack:查看线程运行情况,如线程阻塞、死锁等
  5. jstat:查看垃圾回收情况,如fullGC、youngGC

JVM调优命令

#查看java进程PID信息

jps

#查看java进程信息,PID
jps
#显示完整类名
jps -l 
#显示启动参数
jps -v
#显示完整路径
jps -m
#查看远程主机java进程信息
jps <hostid>

#查看jvm参数配置,此命令和配置-XX:+PrintFlagsInitial等效,另外查看默认垃圾回收器使用-XX:+PrintCommandLineFlags

jinfo 

#查看具体参数配置
jinfo -flag 参数 进程id
#查看所有参数
jinfo -flags 进程id

#查看java进程堆信息,以及导出用于分析的内存镜像快照

 jmap

#查看某个java进程堆信息
jmap -heap <pid>

#生成jvm内存镜像文件,里面包含了内存堆详细的使用信息,用作分析,如jvisualvm
jmap -dump:live,format=b,file=D:\文件名.hprof <pid>
或
jmap -dump:live,format=b,file=D:\文件名.dump<pid>

#查看java进程中线程堆栈信息,可以定位导致异常线程的代码

jstack

#查看java进程线程堆栈信息
jstack -l <pid>


##扩展   配合top命令或ps命令和管道命令使用

#查看具体线程信息,后通过管道命令查看某个线程的堆栈信息
top -Hp <pid>
jstack <pid> | grep -A 10 <线程id的16进制数>

# 或者
ps -T -p <pid>
jstack <pid> | grep -A 10 <线程id的16进制数>

#监控jvm的统计信息,如gc垃圾收集,类加载行为

jstat

#显示有关类加载器行为的统计信息
jstat -class <pid>
#显示有关 Java HotSpot VM 即时编译器行为的统计信息
jstat -compiler <pid>
#显示有关垃圾收集堆行为的统计信息
jstat -gc <pid>
#显示各代容量及其对应空间的统计信息
jstat -gccapacity <pid>
#显示有关垃圾收集统计信息的摘要(与 相同jstat -gcutil),以及最后和当前(如果适用)垃圾收集事件的原因
jstat -gccause <pid>
#显示新生代的行为统计
jstat -gcnew <pid>
#显示新世代的大小及其对应空间的统计信息
jstat -gcnewcapacity <pid>
#显示有关老年代行为的统计信息和元空间统计信息
jstat -gcold <pid>
#显示老年代大小的统计信息
jstat -gcoldcapacity <pid>
#显示有关元空间大小的统计信息
jstat -gcmetacapacity <pid>
#显示有关垃圾收集统计信息的摘要
jstat -gcutil <pid>
#显示 Java HotSpot VM 编译方法统计信息
jstat -printcompilation <pid>

jps -h

usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

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

jmap -h

用法:
    jmap [选项] <pid>
        (连接到正在运行的进程)
    jmap [选项] <executable <core>
        (连接到核心文件)
    jmap [option] [server_id@]<远程服务器 IP 或主机名>
        (连接到远程调试服务器)

其中 <option> 是以下之一:
    <none> 打印与 Solaris pmap 相同的信息
    -heap 打印java堆摘要
    -histo[:live] 打印java对象堆的直方图;如果“活”
                         指定子选项,只计算活动对象
    -clstats 打印类加载器统计信息
    -finalizerinfo 打印关于等待完成的对象的信息
    -dump:<dump-options> 以 hprof 二进制格式转储 java 堆
                         转储选项:
                           活转储仅活对象;如果没有指定,
                                        堆中的所有对象都被转储。
                           format=b 二进制格式
                           file=<file> 将堆转储到 <file>
                         示例:jmap -dump:live,format=b,file=heap.bin <pid>
    -F 力。与 -dump:<dump-options> <pid> 或 -histo 一起使用
                         当 <pid> 没有时强制堆转储或直方图
                         回应。不支持“live”子选项
                         在这种模式下。
    -h | -help 打印此帮助信息
    -J<flag> 将 <flag> 直接传递给运行时系统


#英文原注
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

jstack -h

用法:
     jstack [-l] <pid>
         (连接到正在运行的进程)
     jstack -F [-m] [-l] <pid>
         (连接到挂起的进程)
     jstack [-m] [-l] <可执行文件> <核心>
         (连接到核心文件)
     jstack [-m] [-l] [server_id@]<远程服务器 IP 或主机名>
         (连接到远程调试服务器)

选项:
     -F 强制线程转储。 当 jstack <pid> 没有响应(进程挂起)时使用
     -m 打印 java 和 native 帧(混合模式)
     -l 长列表。 打印关于锁的附加信息
     -h 或 -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)
    -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

jstat -h (详情请看官网https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

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

定义:
  <option> -options 选项报告的选项
  <vmid> 虚拟机标识符。 vmid 采用以下形式:
                     <lvmid>[@<主机名>[:<端口>]]
                其中 <lvmid> 是目标的本地虚拟机标识符
                Java虚拟机,通常是一个进程id; <主机名> 是
                运行目标 Java 虚拟机的主机名;
                <port> 是 rmiregistry 上的端口号
                目标主机。有关更完整的信息,请参阅 jvmstat 文档
                虚拟机标识符的描述。
  <lines> 标题行之间的样本数。
  <interval> 采样间隔。允许使用以下形式:
                    <n>[“毫秒”|“秒”]
                其中 <n> 是一个整数,后缀指定单位为
                毫秒(“ms”)或秒(“s”)。默认单位是“毫秒”。
  <count> 终止前要采集的样本数。
  -J<flag> 将 <flag> 直接传递给运行时系统。


#英文原注
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.

JVM参数配置

参数种类

介绍

例子

-参数

标准参数

-version

-X参数

-Xint

-Xms、-Xmx、-Xss、-Xmn

经典参数,有对应的-XX参数,缩减版

-Xms1024m

-XX:参数=值

开启参数并配置值

-XX:MetaspaceSize=1024m

-XX:+参数

启动该参数配置

-XX:+PrintGCDetials

-XX:-参数

关闭该参数配置

-XX:-

经常使用参数

参数

解释

-XX:+PrintGCDetails

打印GC日志

-XX:+PrintFlagsInitial


打印JVM参数,=是初始值,:=后是修改过但仍是默认值

-XX:+PrintFlagsFinal

打印JVM参数,=是初始值,:=后是修改过并且是最新值

-XX:PrintCommandLineFlags

打印JVM参数,并可以打印默认垃圾回收器

-XX:SurvivorRatio=

设置幸存者与伊甸园区占比,如设置8,则1:1:8

-XX:NewRatio=

设置年轻代和老年代和占比,如设置2,则1:2

-XX:MaxTenuringThreshold

设置对象最大存活年龄,最大15(对象头中占4位)

-XX:HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/..(文件路径)

当系统发生OOM时,生成当时的dump文件