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

news/2024/7/5 8:20:56 标签: jvm, jvm性能调优, jps, jstat, jmap, jstack

文章目录

jps_1">jps

查看所有的jvm进程,包括进程ID,进程启动的路径等等。

我自己也用PS,即:ps -ef | grep java

# jps
1257 Jps
10 wallet-trade-1.0-SNAPSHOT.jar

常用参数

  • -v 输出传递给JVM的参数
# jps -v
1379 Jps -Dapplication.home=/opt/jdk1.8.0_172 -Xms8m
10 wallet-trade-1.0-SNAPSHOT.jar -Xms4096m -Xmx4096m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=40 -XX:G1HeapRegionSize=2 -XX:MaxTenuringThreshold=13 -XX:+UseStringDeduplication -XX:ConcGCThreads=2 -XX:AutoBoxCacheMax=20000 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m -XX:+PrintPromotionFailure -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/java_pid.hprof -Xloggc:/data/trade-gc.log -Duser.timezone=GMT+8 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails
  • -l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
# jps -l
1395 sun.tools.jps.Jps
10 /data/wallet-trade-1.0-SNAPSHOT.jar
  • -m 输出传递给main方法的参数,在嵌入式jvm上可能是null
# jps -m
1411 Jps -m
10 wallet-trade-1.0-SNAPSHOT.jar
  • -q 只显示pid,不显示class名称,jar文件名和传递给main方法的参数
# jps -q
1447
10

jstat_40">jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。

命令的格式如下:

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

常用参数

以下的统计空间单位,未标明的 都是KB

  • 类加载统计

命令:

# jstat -class 10
Loaded  Bytes  Unloaded  Bytes     Time   
 15493 29077.9        0     0.0      12.79

解析:

Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间
  • 编译统计

命令:

# jstat -compiler 10
Compiled Failed Invalid   Time   FailedType FailedMethod
   20321      2       0   121.05          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

解析:

Compiled:编译数量。
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法
  • 垃圾回收统计

命令:

# jstat -gc 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   60416.0  0.0   60416.0 2581504.0 1756160.0 1552384.0   20239.5   94464.0 91393.4 11008.0 10367.6     19    1.385   0      0.000    1.385

解析:

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • 堆内存统计
# jstat -gccapacity 10
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
     0.0 4194304.0 2641920.0    0.0 60416.0 2581504.0        0.0  4194304.0  1552384.0  1552384.0      0.0 1132544.0  94464.0      0.0 1048576.0  11008.0     19     0

解析:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
  • 新生代垃圾回收统计

命令:

# jstat -gcnew 10
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
   0.0 60416.0    0.0 60416.0 13  13 157696.0 2581504.0 1806336.0     19    1.385

解析:

S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
  • 新生代内存统计

命令:

# jstat -gcnewcapacity 10
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
       0.0  4194304.0  2641920.0      0.0      0.0 4194304.0  60416.0  4194304.0  2581504.0    19     0

解析:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
  • 老年代垃圾回收统计

命令:

# jstat -gcold 10
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 94464.0  91393.4  11008.0  10367.6   1552384.0     20239.5     19     0    0.000    1.385

解析:

MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • 老年代内存统计

命令:

# jstat -gcoldcapacity 10
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
        0.0   4194304.0   1552384.0   1552384.0    19     0    0.000    1.385

解析:

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • JDK8 下 元数据空间统计
# jstat -gcmetacapacity 10
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT   
       0.0  1132544.0    94464.0        0.0  1048576.0    11008.0    19     0    0.000    1.385
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • 总结垃圾回收统计

命令:

# jstat -gcutil 10
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00 100.00  71.60   1.30  96.75  94.18     19    1.385     0    0.000    1.385

解析:

S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
  • JVM编译方法统计
# jstat -printcompilation 10
Compiled  Size  Type Method
   20333      6    1 io/netty/util/concurrent/AbstractScheduledEventExecutor$1 compare

解析:

Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型。
Method:方法名标识。

jmap_286">jmap

监控内存内的Java对象

常用参数

  • -heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
# jmap -heap 10
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)

Heap Configuration:   
   MinHeapFreeRatio         = 40  //jvm堆内存最小空闲比例,-XX:MinHeapFreeRatio=40低于这个值将扩展
   MaxHeapFreeRatio         = 70  //jvm堆内存最大空闲比例,-XX:MaxHeapFreeRatio=70超过这个值将收缩
   MaxHeapSize              = 4294967296 (4096.0MB)  //jvm堆最大值
   NewSize                  = 1363144 (1.2999954223632812MB)  //jvm新生代默认值
   MaxNewSize               = 2576351232 (2457.0MB) //jvm新生代最大值
   OldSize                  = 5452592 (5.1999969482421875MB) //jvm老年代默认值
   NewRatio                 = 2 //新生代和老年代比例 1:2
   SurvivorRatio            = 8  //survivor和eden比例 1:8
   MetaspaceSize            = 268435456 (256.0MB) //元空间默认值
   CompressedClassSpaceSize = 1065353216 (1016.0MB)
   MaxMetaspaceSize         = 1073741824 (1024.0MB) /元空间最大值
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 4096
   capacity = 4294967296 (4096.0MB)
   used     = 2273066480 (2167.765121459961MB)
   free     = 2021900816 (1928.234878540039MB)
   52.92395316064358% used
G1 Young Generation:
Eden Space:
   regions  = 2089
   capacity = 2643460096 (2521.0MB)
   used     = 2190475264 (2089.0MB)
   free     = 452984832 (432.0MB)
   82.8639428798096% used
Survivor Space:
   regions  = 59
   capacity = 61865984 (59.0MB)
   used     = 61865984 (59.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 20
   capacity = 1589641216 (1516.0MB)
   used     = 20725232 (19.765121459960938MB)
   free     = 1568915984 (1496.234878540039MB)
   1.303767906329877% used

50595 interned Strings occupying 6038304 bytes.
  • -histo :连接到正在运行的进程并打印Java对象堆的直方图。如果指定了live子选项,那么它只计数活动对象。

  • -finalizerinfo: 连接到正在运行的进程并打印关于等待结束的对象的信息

# jmap -finalizerinfo  10
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11
Number of objects pending for finalization: 0

  • -dump: 以hprof二进制格式,转储Java堆

dump选项:

live 只输出活着的对象;不指定,则输出堆中所有对象

format=b 指定输出格式为二进制

file=<file> 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=/opt/data/

 -F 与-dump:<dump-options> <pid>或-histo<pid>一起使用,当<pid>没有响应时,强制执行;注意:不支持live子选项

pid:进程id

举例:

# jmap -dump:live,format=b,file=/data/gcdump.bin 10
Dumping heap to /data/gcdump.bin ...
Heap dump file created

jstack_379">jstack

jstack是java虚拟机自带的一种堆栈跟踪工具。

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,

如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者

等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程

序何处发生问题

常用参数

  • -F: 当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack,一般情况不需要使用

  • -l: 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多

(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用

  • -m : 打印java和native c/c++ 框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
#  jstack -m 10
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11
^CException in thread "main" java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm

http://www.niftyadmin.cn/n/5189834.html

相关文章

Python学习笔记--线程与进程

线程与进程 线程与进程是操作系统里面的术语&#xff0c;简单来讲&#xff0c;每一个应用程序都有一个自己的进程。 操作系统会为这些进程分配一些执行资源&#xff0c;例如内存空间等。 在进程中&#xff0c;又可以创建一些线程&#xff0c;他们共享这些内存空间&#xff0…

租赁小程序|租赁系统一种新型的商业模式

租赁市场是一个庞大的市场&#xff0c;它由出租人和承租人组成&#xff0c;以及相关的中介机构和供应商等。随着经济的发展和人们对灵活性的需求增加&#xff0c;租赁市场也在不断发展和壮大。特别是在共享经济时代&#xff0c;租赁市场得到了进一步的推动和发展。租赁系统是一…

Mysql数据库 16.SQL语言 数据库事务

一、数据库事务 数据库事务介绍——要么全部成功要么全部失败 我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务 事务——就是完成同一个业务的多个DML操作 例&#xff1a; 数据库事务四大特性 原子性&#xff08;A&#xff09;&#xff1a;一个事务中的多个D…

centos三台主机配置互信ssh登录

1. 修改hosts信息 1.1三台主机上分别修改hosts文件 vi /etc/hosts1.2 三台主机分别填入如下内容&#xff0c;ip地址需要检查正确 192.168.126.223 node1 192.168.126.224 node2 192.168.126.225 node32. 秘钥生成和分发 2.1 在三台主机上分别生成秘钥 命令输入后&#xff…

SpringBoot使用DevTools实现后端热部署

&#x1f4d1;前言 本文主要SpringBoot通过DevTools实现热部署的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&…

使用 Redis GEO 获取两个坐标的直线距离、以及给定坐标获取半径不超过指定距离的元素

目录 一、前言二、Redis GEO 常用命令介绍三、Redis GEO 获取两个坐标的直线距离四、Redis GEO 给定坐标获取半径不超过指定距离的元素 一、前言 在做快递外卖等配送业务时经常需要使用到&#xff0c;计算配送员距离商家的直线距离&#xff0c;和检索商家坐标给定一个半径内全部…

flink的window和windowAll的区别

背景 在flink的窗口函数运用中&#xff0c;window和windowAll方法总是会引起混淆&#xff0c;特别是结合上GlobalWindow的组合时&#xff0c;更是如此&#xff0c;本文就来梳理下他们的区别和常见用法 window和windowAll的区别 window是KeyStream数据流的方法&#xff0c;其…

.nc格式文件的显示及特殊裁剪方式

最近我们遇到一个nc格式的文件&#xff0c;需要将它做成报告插图&#xff0c;bing搜索一番以后&#xff0c;了解到nc的全名为NetCDF(network Common Data Form)&#xff0c;是一种网络通用数据格式&#xff0c;广泛用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。…