javajstat分析

如何查找java进程僵死原因

遇到这种情况,一般可以依次从下面几方面处理(不一定全部进行):

1、查看业务日志,如果系统的日志打得好的话,一般这个就能发现大部分问题

2、综合vmstat、iostat、top等命令查看下系统资源消耗情况,包括CPU、IO、网络等

3、查看Tomat日志

4、jstat -gcutil查看GC状况

5、查看GC日志

6、如果还不行,就再看看系统日志,比如too many open files这种错误一般是因为文件句柄数耗尽导致

javajstat分析

jvm 性能调优工具之 jstat 命令详解

Jstat名称:Java Virtual Machine statistics monitoring tool

功能描述:

Jstat是JDK自带的一个轻量级小工具。它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。

命令用法:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

注意:使用的jdk版本是jdk8。

C:\Users\Administratorjstat -helpUsage: jstat -help|-options jstat -option [-t] [-hlines] 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. -Jflag Pass flag directly to the runtime system.

option:参数选项

-t:可以在打印的列加上Timestamp列,用于显示系统运行的时间

-h:可以在周期性数据输出的时候,指定输出多少行以后输出一次表头

vmid:Virtual Machine ID( 进程的 pid)

interval:执行每次的间隔时间,单位为毫秒

count:用于指定输出多少次记录,缺省则会一直打印

option 可以从下面参数中选择

jstat -options

-class 用于查看类加载情况的统计

-compiler 用于查看HotSpot中即时编译器编译情况的统计

-gc 用于查看JVM中堆的垃圾收集情况的统计

-gccapacity 用于查看新生代、老生代及持久代的存储容量情况

-gcmetacapacity 显示metaspace的大小

-gcnew 用于查看新生代垃圾收集的情况

-gcnewcapacity 用于查看新生代存储容量的情况

-gcold 用于查看老生代及持久代垃圾收集的情况

-gcoldcapacity 用于查看老生代的容量

-gcutil 显示垃圾收集信息

-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因

-printcompilation 输出JIT编译的方法信息

示例:

1.-class 类加载统计

[root@hadoop ~]# jps #先通过jps获取到java进程号(这里是一个zookeeper进程)3346 QuorumPeerMain7063 Jps[root@hadoop ~]# jstat -class 3346 #统计JVM中加载的类的数量与sizeLoaded Bytes Unloaded Bytes Time 1527 2842.7 0 0.0 1.02

Loaded:加载类的数量

Bytes:加载类的size,单位为Byte

Unloaded:卸载类的数目

Bytes:卸载类的size,单位为Byte

Time:加载与卸载类花费的时间

2.-compiler 编译统计

[root@hadoop ~]# jstat -compiler 3346 #用于查看HotSpot中即时编译器编译情况的统计Compiled Failed Invalid Time FailedType FailedMethod 404 0 0 0.19 0

Compiled:编译任务执行数量

Failed:编译任务执行失败数量

Invalid:编译任务执行失效数量

Time:编译任务消耗时间

FailedType:最后一个编译失败任务的类型

FailedMethod:最后一个编译失败任务所在的类及方法

3.-gc 垃圾回收统计

[root@hadoop ~]# jstat -gc 3346 #用于查看JVM中堆的垃圾收集情况的统计 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 128.0 128.0 0.0 128.0 1024.0 919.8 15104.0 2042.4 8448.0 8130.4 1024.0 996.0 7 0.019 0 0.000 0.019

S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

EC:年轻代中Eden(伊甸园)的容量 (字节)

EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)

OC:Old代的容量 (字节)

OU:Old代目前已使用空间 (字节)

MC:metaspace(元空间)的容量 (字节)

MU:metaspace(元空间)目前已使用空间 (字节)

CCSC:当前压缩类空间的容量 (字节)

CCSU:当前压缩类空间目前已使用空间 (字节)

YGC:从应用程序启动到采样时年轻代中gc次数

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

FGC:从应用程序启动到采样时old代(全gc)gc次数

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)

4.-gccapacity 堆内存统计

[root@hadoop ~]# jstat -gccapacity 3346 #用于查看新生代、老生代及持久代的存储容量情况 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0[root@hadoop ~]# jstat -gccapacity -h5 3346 1000 #-h5:每5行显示一次表头 1000:每1秒钟显示一次,单位为毫秒 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0 1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0

NGCMN:年轻代(young)中初始化(最小)的大小(字节)

NGCMX:年轻代(young)的最大容量 (字节)

NGC:年轻代(young)中当前的容量 (字节)

S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

EC:年轻代中Eden(伊甸园)的容量 (字节)

OGCMN:old代中初始化(最小)的大小 (字节)

OGCMX:old代的最大容量(字节)

OGC:old代当前新生成的容量 (字节)

OC:Old代的容量 (字节)

MCMN:metaspace(元空间)中初始化(最小)的大小 (字节)

MCMX:metaspace(元空间)的最大容量 (字节)

MC:metaspace(元空间)当前新生成的容量 (字节)

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:从应用程序启动到采样时年轻代中gc次数

FGC:从应用程序启动到采样时old代(全gc)gc次数

5.-gcmetacapacity 元数据空间统计

[root@hadoop ~]# jstat -gcmetacapacity 3346 #显示元数据空间的大小MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 8 0 0.000 0.020

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:从应用程序启动到采样时年轻代中gc次数

FGC:从应用程序启动到采样时old代(全gc)gc次数

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)

6.-gcnew 新生代垃圾回收统计

[root@hadoop ~]# jstat -gcnew 3346 #用于查看新生代垃圾收集的情况S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT128.0 128.0 67.8 0.0 1 15 64.0 1024.0 362.2 8 0.020

S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

TT:持有次数限制

MTT:最大持有次数限制

DSS:期望的幸存区大小

EC:年轻代中Eden(伊甸园)的容量 (字节)

EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)

YGC:从应用程序启动到采样时年轻代中gc次数

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

7.-gcnewcapacity 新生代内存统计

[root@hadoop ~]# jstat -gcnewcapacity 3346 #用于查看新生代存储容量的情况NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC1280.0 83264.0 1280.0 8320.0 128.0 8320.0 128.0 66624.0 1024.0 8 0

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.-gcold 老年代垃圾回收统计

[root@hadoop ~]# jstat -gcold 3346 #用于查看老年代及持久代垃圾收集的情况MC MU CCSC CCSU OC OU YGC FGC FGCT GCT8448.0 8227.5 1024.0 1003.7 15104.0 2102.2 8 0 0.000 0.020 

MC:metaspace(元空间)的容量 (字节)

MU:metaspace(元空间)目前已使用空间 (字节)

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

OC:Old代的容量 (字节)

OU:Old代目前已使用空间 (字节)

YGC:从应用程序启动到采样时年轻代中gc次数

FGC:从应用程序启动到采样时old代(全gc)gc次数

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)

9.-gcoldcapacity 老年代内存统计

[root@hadoop ~]# jstat -gcoldcapacity 3346 #用于查看老年代的容量OGCMN OGCMX OGC OC YGC FGC FGCT GCT15104.0 166592.0 15104.0 15104.0 8 0 0.000 0.020

OGCMN:old代中初始化(最小)的大小 (字节)OGCMX:old代的最大容量(字节)OGC:old代当前新生成的容量 (字节)OC:Old代的容量 (字节)YGC:从应用程序启动到采样时年轻代中gc次数FGC:从应用程序启动到采样时old代(全gc)gc次数FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)GCT:从应用程序启动到采样时gc用的总时间(s) 在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

10.-gcutil 垃圾回收统计

[root@hadoop ~]# jstat -gcutil 3346 #显示垃圾收集信息S0 S1 E O M CCS YGC YGCT FGC FGCT GCT52.97 0.00 42.10 13.92 97.39 98.02 8 0.020 0 0.000 0.020 

S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

O:old代已使用的占当前容量百分比

M:元数据区已使用的占当前容量百分比

CCS:压缩类空间已使用的占当前容量百分比

YGC :从应用程序启动到采样时年轻代中gc次数

YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)

FGC :从应用程序启动到采样时old代(全gc)gc次数

FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)

11.-gccause

[root@hadoop ~]# jstat -gccause 3346 #显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC52.97 0.00 46.09 13.92 97.39 98.02 8 0.020 0 0.000 0.020 Allocation Failure No GC

LGCC:最后一次GC原因

GCC:当前GC原因(No GC 为当前没有执行GC)

12.-printcompilation JVM编译方法统计

[root@hadoop ~]# jstat -printcompilation 3346 #输出JIT编译的方法信息Compiled Size Type Method421 60 1 sun/nio/ch/Util$2 clear

Compiled:编译任务的数目

Size:方法生成的字节码的大小

Type:编译类型

Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的

远程监控

与jps一样,jstat也支持远程监控,同样也需要开启安全授权,方法参照jps。

C:\Users\Administratorjps 192.168.146.1283346 QuorumPeerMain3475 JstatdC:\Users\Administratorjstat -gcutil 3346@192.168.146.128 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 52.97 0.00 65.15 13.92 97.39 98.02 8 0.020 0 0.000 0.020

JVM常用调试工具介绍

一、Linux ps (英文全拼:process status)命令用于显示当前进程的状态

ps aux 基本输出

ps aux 列名解释

注:优化机器资源主要从占用机器cpu和mem高的程序入手

二、Linux top命令查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等

基本输出

字段解释

三、Linux top -H -p pid。查看某个进程内部线程占用情况

四、jps(Java Virtual Machine Process Status Tool) 是java提供的一个显示当前所有java进程pid的命令

五、jinfo LVMID。可以用来查看 Java 进程运行的 JVM 参数

六、jstat(Java Virtual Machine statistics monitoring tool)主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用

七、jstack(Java Stack Trace Tool)主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源

八、jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节

九、MAT(Memory Analysis Tools)是一个分析 Java堆数据的专业工具,用它可以定位内存泄漏的原因

此次分享准备过程中,发现JDK调试工具在Root用户下访问Yarn用户启动的Java虚拟机,获取不到信息,jstatck获取到的还不全(没有线程描述信息行)

可以使用 sudo -u yarn /usr/java/jdk1.8.0_181-cloudera/bin/jstack 这种方式获取。

Linux使用jstat命令查看jvm的GC情况

Linux 使用jstat命令查看jvm的GC情况

命令格式

jstat命令命令格式:

jstat [Options] vmid[interval] [count]

参数说明:

Options,选项,我们一般使用 -gcutil 查看gc情况

vmid

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

interval

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

count

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

示例说明

示例

通常运行命令如下:

jstat -gc 12538 5000

即会每5秒一次显示进程号为12538的java进成的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)

NGCMN

:年轻代(young)中初始化(最小)的大小 (字节)

NGCMX

:年轻代(young)的最大容量 (字节)

NGC

:年轻代(young)中当前的容量 (字节)

OGCMN

:old代中初始化(最小)的大小 (字节)

OGCMX

:old代的最大容量 (字节)

OGC

:old代当前新生成的容量 (字节)

PGCMN

:perm代中初始化(最小)的大小 (字节)

PGCMX

:perm代的最大容量 (字节)

PGC

:perm代当前新生成的容量 (字节)

S0

:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

S1

:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

E

:年轻代中Eden(伊甸园)已使用的占当前容量百分比

O

:old代已使用的占当前容量百分比

P

:perm代已使用的占当前容量百分比

S0CMX

:年轻代中第一个survivor(幸存区)的最大容量 (字节)

S1CMX

:年轻代中第二个survivor(幸存区)的最大容量 (字节)

ECMX

:年轻代中Eden(伊甸园)的最大容量 (字节)

DSS

:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

TT

: 持有次数限制

MTT

: 最大持有次数限制

JDK命令介绍

命令jps用于列出java进程,直接运行jps不加任何参数,可以列出Java程序的进程ID以及Main函数等名称。

参数-q指定jps只输出进程ID,而不输出类的短名称

参数-m用于输出传递给Java进程(主函数)的参数

参数 -l用于输出主函数的完整路径

参数 -v可以显示传递给JVM的参数

jstat是一个可以用于观察Java应用程序运行时信息的工具。它的功能非常强大,可以通过它,查看堆信息的详细使用情况。主要用于监控虚拟机的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等,在没有GUI的服务器上,这款工具是首选的一款监控工具。

基本使用语法为:

选项option可以由以下值构成:

-class:显示ClassLoader的相关信息。

-compiler:显示JIT编译的相关信息。

-gc:显示与GC相关的堆信息。

-gccapacity:显示各个代的容量及使用情况。

-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因。

-gcnew:显示新生代信息。

-gcnewcapacity:显示新生代大小与使用情况。

-gcold:显示老年代与永久代的信息。

-gcoldcapacity:显示老年代的大小。

-gcmetacapacity:显示元空间的大小。(在java8之前是使用-gcpermcapacity显示永久代的大小)

-gcutil:显示垃圾收集信息。

-printcompilation:输出JIT编译的方法信息。

以上选项可以输入 jstat -options 查看。

-t 参数可以在输出信息前加一个 Timestamp 列,显示程序的运行时间。

-h 参数可以在周期性数据输出时,输出多少行数据后,跟着输出一个表头信息。

vmid 参数就是Java进程id。

interval 参数用于指定输出统计数据的周期,单位为毫秒。

count 用于指定一共输出多少次数据。

jinfo 可以用来查看正在运行的Java运行程序的扩展参数,甚至支持在运行时修改部分参数。可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。

jmap 可以生成Java应用程序的堆快照和对象的统计信息。基本语法为:

option 选项如下:

-dump 生成java堆转储快照。格式为: -dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象

-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效

-heap 显示java堆详细信息,如使用哪种收集器、参数配置、分代情况等,在Linux/Solaris平台下有效

-histo 显示堆中对象统计信息,包含类、实例对象、合集容量

-permstat 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效

-F 当虚拟机进程对-dump选项没有相应时。可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效

使用 jhat 工具可以用于分析Java应用程序的堆快照内容。jhat 在分析完成后,使用HTTP服务器展示其分析结果。在浏览器中访问

jstack 可用于导出Java应用程序的线程堆栈。语法为:

-l选项用于打印锁的附加信息。

jstack 工具会在控制台输出程序中所有的锁信息,可以使用重定向将输出保存到文件。

通过 jstack 工具不仅可以得到线程堆栈,它还能自动进行死锁检查,输出找到的死锁信息。

之前所述的工具中,只涉及到监控本机的Java应用程序。而在这些工具中,一些监控工具也支持对远程计算机的监控(如:jps、jstat)。为了启用远程监控,则需要配合使用jstatd工具。

命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本机的Java应用程序信息传递到远程计算机。

JConsole(Java Monitoring and ManagementConsole)工具时JDK自带的图形化性能监控工具。通过JConsole工具,可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等。

java8 怎么理解jstat

JDK自带VM分析工具jps,jstat,jmap,jconsole

关键字: jdk自带vm分析工具jps,jstat,jmap,jconsole

一、概述

SUN 的JDK中的几个工具,非常好用。秉承着有免费,不用商用的原则。以下简单介绍一下这几种工具。(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装) 。

我一共找到以下四个工具:重点看看jconsole和jmap。

jps

:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。

jstat

:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

jmap

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

jconsole

:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

二、 使用介绍:

1、jps :我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。

使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。

可惜没有linux下的ps好用,名称不好用。但是在第四个工具jconsole的界面里面会有具体JAR包的名称。

2、jstat :对VM内存使用量进行监控。

jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。

jstat -class pid:显示加载class的数量,及所占空间等信息。

jstat -compiler pid:显示VM实时编译的数量等信息。

jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。

jstat -gcnew pid:new对象的信息。

jstat -gcnewcapacity pid:new对象的信息及其占用量。

jstat -gcold pid:old对象的信息。

jstat -gcoldcapacity pid:old对象的信息及其占用量。

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

jstat -util pid:统计gc信息统计。

jstat -printcompilation pid:当前VM执行的信息。

除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

3、jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pida.log可以将其保存到文本中去(windows下也可以使用),在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。 jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。

4、jconsole 是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。由于是GUI程序,这里就不详细介绍了,不会的地方可以参考SUN的官方文档。

使用方法:命令行里打 jconsole,选则进程就可以了。

友好提示:windows查看进程号,由于任务管理器默认的情况下是不显示进程id号的,所以可以通过如下方法加上。ctrl+alt+del打开任务管理器,选择‘进程’选项卡,点‘查看’-”选择列”-加上”PID”,就可以了。当然还有其他很好的选项。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月24日 22:59:21
下一篇 2024年3月24日 23:04:44

发表回复

登录后才能评论



关注微信