Linux下常用java问题排查命令、工具

本文描述的大部分基于linux环境。
对于一个程序,在Linux下我们可以根据程序响应信息查找对应的进程ID:

ps  -ef | grep java | grep  -v  grep | |awk '{print $2}'

这样我们就能获得对应程序的进程id,PID

获得PID之后,我们首先可以查看程序所占内存:
top -p $PID

在这里插入图片描述

这时候能沟动态的看到进程所占用的CPU和内存占比。

%Cpu(s)显示的是cpu相关使用情况:
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断(Hardware IRQ)占用CPU的百分比
si — 软中断(Software Interrupts)占用CPU的百分比

top 默认显示的是所有 CPU 的平均值,这个时候你只需要按下数字 1,就可以切换到每个 CPU 的使用率了。

Mem、Swap则显示的是内存和swap空间使用情况
接下来显示的则是进程相关信息:

PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状
当我们使用top命令进入top命令行之后,
:
输入P则按照cpu使用率排序;输入M则按照内存使用排序;输入c显示命令的绝对路径;默认的屏幕刷新间隔是3秒钟,输入d后可以指定间隔;输入k后在输入对应进程PID可以kill对应进程;输入W能够保存当前top的配置;top命令默认不停刷新,如下命令在刷新5次后就退出:top -n 5

top命令参数:

usage:  top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
  • -d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
  • -p 通过指定监控进程ID来仅仅监控某个进程的状态。
  • -q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
  • -S 指定累计模式
  • -s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
  • -i 使top不显示任何闲置或者僵死进程。
  • -c 显示整个命令行而不只是显示命令名
  • -H 线程模式

top命令下可以使用的交互命令:

  • h,? 显示帮助画面,给出一些简短的命令总结说明。
  • k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
  • i 忽略闲置和僵死进程。这是一个开关式命令。
  • q 退出程序。
  • r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
  • S 切换到累计模式。
  • s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
  • f,F 从当前显示中添加或者删除项目。
  • o,O 改变显示项目的顺序。
  • l 切换显示平均负载和启动时间信息。
  • m 切换显示内存信息。
  • t 切换显示进程和CPU状态信息。
  • c 切换显示命令名称和完整命令行。
  • M 根据驻留内存大小进行排序。
  • P 根据CPU使用百分比大小进行排序。
  • T 根据时间/累计时间进行排序。
  • W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
    top -H -p进程ID 进入线程模式
查看磁盘容量

通过df -h 来查看:
在这里插入图片描述

查看文件大小

可以通过 du -sh 来查看,
du -sh 显示当前文件夹下所有文件的大小之和
du -sh * 显示当前路径下的文件或文件夹的大小
du -sh 路径 显示路径对应的文件或文件夹的大小。

vmstat统计系统内存、CPU、进程状态等

一般vmstat可以传入指定间隔和刷新几次退出:
vmstat 3 每三秒更新一次
vmstat 3 5 每三秒显示一次,更新5次后退出
在这里插入图片描述
procs: 其中r表示运行和登台CPU时间片的进程数,这个值如果长期大于CPU的个数,说明CPU不足,需要增加CPU;b表示在等待资源的进程数,比如正在等待I/O或者内存交换等

memory:显示内存相关信息,swpd显示切换到内存交换区的内存大小,如果spwd的值不为0 ,或者比较大,只要si,so的值长期为0,一般不用担心,不会影响系统性能;free表示当前空闲的物理内存;buff表示buffers cache的内存数量,一般对块设备的读写需要缓冲;cache表示page cached的内存数量,如果cache值比较大,说明缓存的文件数比较多,如果io中的bi比较小,说明文件系统效率比较好

swapsi表示由磁盘调入内存,也就是从内存进入内存交换区的内存大小;so表示由内存调入磁盘,也就是由内存交换区进入内存的内存大小,一般情况下,si,so为0,如果长期不为0,表示系统内存不足,需要增加系统内存
io:显示磁盘读写情况,bi表示读入数据总量;bo表示写入数据总量,一般设置bi+bo的参考值为1000,如果超过1000,且wa值比较大,表示磁盘I/O有问题,需要提供磁盘读写西性能。
system:表示采集间隔内发生的中断次数,in表示在某一间隔时间内观察到的每秒设备中断数,cs表示每秒产生的上下文切换次数,如果in和cs的次数很大,则内核消耗的cpu时间越多

cpu: 显示了cpu的使用状态,us用户进程消耗cpu的时间占比;sy内核进程消耗cpu的时间占比,如果us+sy 大于80%则可能存在cpu资源不足id表示cpu处在空闲状态的时间占比;wa显示I/O等待所占用CPU时间占比,wa值越高,说明I/O等待严重,一般参考值是20%

sar获取系统CPU、运行队列、磁盘I/O、分页、内存、网络等信息

sar使用格式如下:

sar [options] [-A] [-o file] interval [n]

其中:
interval为采样间隔,必须有,n为采样次数,默认值是1;
-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。
options 为命令行选项,sar命令常用选项如下:

-A:显示所有资源(CPU、内存、磁盘)运行信息
-u:输出系统所有CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
-P:显示指定CPU的使用情况

sar -u 3 5 显示如下:
在这里插入图片描述

iostat磁盘统计

用法:iostat [ 选项 ] [ <时间间隔> [ <次数> ]

常用选项说明:

-c:只显示系统CPU统计信息,即单独输出avg-cpu结果,不包括device结果
-d:单独输出Device结果,不包括cpu结果
-k/-m:输出结果以kB/mB为单位,而不是以扇区数为单位
-x:输出更详细的io设备统计信息
interval/count:每次输出间隔时间,count表示输出次数,不带count表示循环输出
free查看内存

用法:
free [-bkmotV][-s <间隔秒数>]

-b  以Byte为单位显示内存使用情况。
-k  以KB为单位显示内存使用情况。
-m  以MB为单位显示内存使用情况。
-h  以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值。

比如:free -m
在这里插入图片描述

uptime 统计系统当前运行情况

输入uptime,输出如下:
在这里插入图片描述
输出信息依次为:系统现在的时间,系统从上次开机到现在运行了多长时间,系统目前有多少登录用户,系统在一分钟内、5分钟内、15分钟内的平均负载

网络相关可以参考这里: Linux常用网络相关命令

pidstat

pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

pidstat help
Usage: pidstat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]
[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]

常用参数:

  • -u:默认的参数,显示各个进程的cpu使用统计
  • -r:显示各个进程的内存使用统计
  • -d:显示各个进程的IO使用情况
  • -p:指定进程号
  • -w:显示每个进程的上下文切换情况, cswch 表示每秒自愿上下文切换(voluntary context switches)的次数,指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。,nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
  • -t:显示选择任务的线程的统计信息外的额外信息
  • -T { TASK | CHILD | ALL }
    这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
    注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
  • -V:版本号
  • -h:在一行上显示了所有活动,这样其他程序可以容易解析。
  • -I:在SMP环境,表示任务的CPU使用率/内核数量
  • -l:显示命令名和所有参数

在这里插入图片描述
在这里插入图片描述

上面是一些常用的Linux下系统相关指标的统计分析。
下面说说java常用性能监控工具:

jcmd

打印java进程所涉及的基本类、线程和VM信息
jcmd -l 列出当前所有运行的java进程
jcmd PID help 列出指定java进程支持的命令
在这里插入图片描述

然后可以根据列出的命令通过jcmd执行:

jcmd PID VM-CMD

比如:

# jcmd 48952 VM.version
48952:
Java HotSpot(TM) 64-Bit Server VM version 25.101-b13
JDK 8.0_101
jconsole

Jconsole是JDK自带的监控工具,提供jvm活动的图形化视图,包括线程的使用、类的使用和GC活动
在这里插入图片描述
在这里插入图片描述

jhat

jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。是java虚拟机自带的一种虚拟机堆转储快照分析工具。使用jmap等方法生成java的堆文件后,使用其进行分析。

jmap

提供堆转储和其他jvm内存的使用信息
使用方法如下

# jmap -h
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。
  • executable: 产生核心dump的Java可执行文件。
  • core: 需要打印配置信息的核心文件。
  • server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
    remote server IP or hostname 远程调试服务器的IP地址或主机名。
    选项参数:
  • no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
  • heap: 显示Java堆详细信息
  • histo[:live]: 显示堆中对象的统计信息
  • clstats:打印类加载器信息
  • finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • dump::生成堆转储快照
  • F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
  • help:打印帮助信息
  • J:指定传递给运行jmap的JVM的参数
    一般可以使用jmap -dump:live,file=dump.file PID转储堆信息,然后借助其他工具分析堆的情况
jinfo

查看jvm系统属性,可以动态设置一些系统属性,使用方式如下:

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

比如:
jinfo -flag InitialHeapSize pid //查看初始堆内存
jinfo -flag MaxHeapSize pid //查看最大堆内存
jinfo -flag PermSize pid //查看初始分配的非堆内存
jinfo -flag MaxPermSize pid //查看最大允许分配的非堆内存
jinfo -flags pid //查看设置过值的参数
jinfo -flag UseConcMarkSweepGC pid //查看垃圾回收器
jinfo -flag UseG1GC pid //查看垃圾回收器
jinfo -flag UseParallelGC pid //查看垃圾回收器

jstack

转储java进程的信息,使用参数如下:

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

可以通过Linux中kill -3 获得线程dump或者:

jstack -l pid > ./jstack.log

jstat

提供与JVM性能相关的统计信息,例如垃圾收集、编译活动、类装载等。 jstat的主要优势在于,它可以在运行JVM且无需任何先决条件的情况下动态捕获这些指标,是一个轻量级工具
使用方式如下:

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.

[options] : 操作参数,一般使用 -gcutil 查看gc情况
VMID : 本地虚拟机进程ID,即当前运行的java进程号
[interval] : 连续输出的时间间隔,单位为秒或者毫秒
[count] : 连续输出的次数,如果缺省打印无数次

可用参数如下:

-class           			类加载的行为统计
-compiler					JIT编译器行为统计
-gc							垃圾回收的行为统计
-gccapacity				各个垃圾回收代容量和他们相应的空间统计
-gccause					垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
-gcmetacapacity		统计元空间使用情况 
-gcnew					显示新生代统计信息
-gcnewcapacity		统计新生代及内存使用情况
-gcold						统计老年代和元空间使用情况 
-gcoldcapacity			统计老年代内存使用情况
-gcutil						显示各个各代内存使用百分比
-printcompilation		虚拟机方法编译统计情况

统计类加载情况

# jstat -class 37367     
Loaded  Bytes  Unloaded  Bytes     Time   
 11872 22637.4        1     0.9      10.06
 
Loaded :加载class的数量
Bytes : 加载class的大小(单位KB)
Unloaded :卸载class的数量
Bytes: 卸载class的大小(单位KB)
Time : 加载和卸载class所耗费的时间

gc统计

jstat -gc 37367         
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3072.0 3072.0  0.0   624.0  692736.0 185851.9 1398272.0   47526.5   73432.0 70889.0 8664.0 8172.8   1219    4.812   3      0.366    5.178


S0C : 第一个幸存区的总容量(KB)
S1C : 第二个幸存区的总容量(KB)
S0U : 第一个幸存区已使用的容量(KB)
S1U : 第二个幸存区已使用的容量(KB)
EC : 伊甸区的总容量(KB)
EU : 伊甸区已使用容量(KB)
OC : 老年区的总容量(KB)
MC : 元空间的总容量(KB)
MU : 元空间已使用容量(KB)
CCSC : 压缩类空间总容量(KB)
CCSU : 压缩类空间已使用总容量(KB)
YGC : 新生代GC次数
YGCT :新生代GC总耗费时间
FGC : 老年代GC次数
FGCT : 老年代GC总耗费时间
GCT : GC总耗费时间

JIT编译器行为统计

 jstat -compiler 37367
Compiled Failed Invalid   Time   FailedType FailedMethod
   12654      6       0    47.33          1 org/springframework/beans/factory/support/AbstractBeanFactory isTypeMatch

Compiled :编译成功数
Failed : 编译失败数
Invalid : 无效数量
FailedType : 最后一次编译失效类型
FailedMethod :最后一次编译失效的方法

每个代gc统计

 jstat -gccapacity 37367
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
698880.0 698880.0 698880.0 3072.0 3072.0 692736.0  1398272.0  1398272.0  1398272.0  1398272.0      0.0 1114112.0  73432.0      0.0 1048576.0   8664.0   1219     3

NGCMN : 新生代占用的最小空间大小(KB)
NGCMX : 新生代占用的最大空间大小(KB)
NGC : 当前新生代空间大小(KB)
S0C : 第一幸存区当前空间大小(KB)
S1C :第二幸存区当前空间大小(KB)
EC : 伊甸区当前空间大小(KB)
OGCMN : 老年区最小空间大小(KB)
OGCMX : 老年区最大空间大小(KB)
OGC : 老年区当前空间大小(KB)
MCMN : 元空间最小空间大小(KB)
MCMX : 元空间最大空间大小(KB)
MC : 元空间当前空间大小(KB)
CCSMN : 压缩类空间最小大小(KB)
CCSMX : 压缩类最大空间大小(KB)
CCSC : 压缩类当前空间大小(KB)
YGC : 新生代GC次数
FGC : 老年代GC次数

垃圾收集统计概述

jstat -gccause 37367   
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
  0.00  20.31  29.44   3.40  96.54  94.33   1219    4.812     3    0.366    5.178 Allocation Failure   No GC  


S0 :第一幸存区已使用空间百分比.
S1 : 第二幸存区已使用空间百分比
E : 伊甸区已使用空间百分比
O : 老年区已使用空间百分比
M : 元空间使用百分比
CCS : 压缩类空间使用百分比
YGC : 新生代GC次数
FGC : 老年代GC次数
LGCC :最近一次GC原因
GCC : 当前GC原因

元空间使用情况

jstat -gcmetacapacity 37367
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1114112.0    73432.0        0.0  1048576.0     8664.0  1219     3    0.366    5.178

MCMN : 元空间最小空间大小(KB)
MCMX : 元空间最大空间大小(KB)
MC : 元空间当前空间大小(KB)
CCSMN : 压缩类空间最小空间大小(KB)
CCSMX : 压缩类空间最大空间大小(KB)
CCSC : 压缩类空间当前空间大小(KB)
YGC : 新生代GC次数
FGC : 老年代GC次数
FGCT: 老年代GC耗费时间
GCT : GC总耗费时间

新生代统计信息:

jstat -gcnew 37367         
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
3072.0 3072.0    0.0  624.0 15  15 3072.0 692736.0 208342.6   1219    4.812

S0C : 第一幸存区总空间大小(KB)
S1C : 第二幸存区总空间大小(KB)
S0U : 第一幸存区已使用空间大小(KB)
S1U : 第二幸存区已使用空间大小(KB)
TT : 提升阈值(提升阈值)
MTT : 最大阈值
DSS : survivor区域大小 (KB)
EC : 伊甸区总空间大小(KB)
EU : 伊甸区已使用空间大小(KB)
YGC : 新生代GC次数
YGCT :新生代GC总耗费时间

统计新生代及内存使用情况:

jstat -gcnewcapacity 37367
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
  698880.0   698880.0   698880.0 232960.0   3072.0 232960.0   3072.0   697856.0   692736.0  1219     3

NGCMN : 新生代最小空间大小(KB)
NGCMX : 新生代最大空间大小(KB)
NGC : 当前新生代空间大小(KB)
S0CMX : 第一幸存区最大空间大小(KB)
S0C : 第一幸存区当前空间大小(KB)
S1CMX : 第二幸存区最大空间大小(KB)
S1C : 第二幸存区当前空间大小(KB)
ECMX : 伊甸区最大空间大小(KB)
EC : 伊甸区当前空间大小(KB)
YGC : 新生代GC次数
FGC : 老年代GC次数

统计老年代和元空间使用情况:

jstat -gcold 37367        
  MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
73432.0  70889.0   8664.0   8172.8   1398272.0     47526.5   1219     3    0.366    5.178

MC : 元空间总大小(KB)
MU : 元空间已使用大小(KB)
CCSC : 压缩类空间总大小(KB)
CCSU : 压缩类空间已使用大小(KB)
OC : 老年区空间总大小(KB)
OU : 老年区已使用大小(KB)
YGC : 新生代GC次数
FGC : 老年代GC次数
FGCT : 老年代GC总耗时
GCT : GC总耗时

统计老年代内存使用情况:

jstat -gcoldcapacity 37367
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
  1398272.0   1398272.0   1398272.0   1398272.0  1219     3    0.366    5.178

OGCMN :老年区占用最小空间(KB)
OGCMX : 老年区占用最大空间(KB)
OGC : 当前老年区空间(KB)
OC : 当前老年区空间(KB)
YGC :新生代GC次数
FGC : 老年代GC次数
FGCT : 老年代GC总耗时
GCT : GC总耗时

垃圾回收统计:

 jstat -gcutil 37367       
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  20.31  32.01   3.40  96.54  94.33   1219    4.812     3    0.366    5.178

S0 :第一幸存区已使用空间百分比.
S1 : 第二幸存区已使用空间百分比
E : 伊甸区已使用空间百分比
O : 老年区已使用空间百分比
M : 元空间使用百分比
CCS : 压缩类空间使用百分比
YGC : 新生代GC次数
FGC : 老年代GC次数
GCT :GC总耗时

方法编译统计情况:

jstat -printcompilation 37367
Compiled  Size  Type Method
   12659      6    1 com/google/common/cache/LocalCache$AccessQueue$1 setNextInAccessQueue

Compiled : 已编译方法次数
Size : 最近一次方法编译大小
Type : 最近一次编译方法类型
Method : 最近一次编译方法
jvisualvm

与jconsole类似,可以通过界面方式查看统计分析java程序内存、线程等情况。
如果需要统计远端程序,需要在程序启动添加如下启动参数:

 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

添加远程监控统计:
在这里插入图片描述

然后添加JMX连接在这里插入图片描述

记住后面需要添加端口号,默认的端口号是1099
在这里插入图片描述

JProfiler

也是一个性能监控工具,

这里分享一个windows版本破解版给大家
链接: https://pan.baidu.com/s/10VyMw8slBec07-2-TP2ZzA?pwd=5f36 提取码: 5f36 复制这段内容后打开百度网盘手机App,操作更方便哦

JFR

JFR全名为java flight recorder),其在jmc中(Java Mission Control),jmc可以直接在控制台输入,就能启动jmc界面,
要想查看jfr可以通过两种方式,

  1. jcmd JFR.start name=test duration=60s settings=template.jfc filename=output.jfr
    上述命令立即启动JFR并开始使用templayte.jfc的配置收集60s的JVM信息,输出到output.jfr中
  2. 在JVM的启动参数中增加如下参数:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
常规案例

查看当前程序CPU过高问题

  1. 首先可以通过top 命令获取到当前系统下CPU占比最高的进程,
  2. 然后通过top -H -p进程ID获取该进程内CPU占比比价高的线程ID,将线程ID转转为16进制,Linux下可以通过printf %x id
  3. 通过jstack -l pid > statck.info打印进程的线程栈
  4. 然后在线程栈里面找到第二步对应的线程ID(java线程栈里面的线程ID是16进制)

系统OOM排查

  1. 通过ps获取对应的进程ID
  2. jstat -gcutil 进程ID 5 5 查看当前程序GC状态(每隔5秒统计一次gc状态,总共5次)
  3. 通过jmap -histo:live 进程ID,统计存活对象, 从高到低查看占据内存最多的对象
  4. 通过jmap -dump:format=b,file=temp.info 线程ID,导出jmap dump堆内存转储
    (也可以在jvm启动参数增加: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./temp/ 当发生OOM时转储对内存快照 )
  5. 对上面导出的dump文件进行分析
  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值