jstack、jmap、jstat

本文详细介绍jstack、jmap和jstat三个Java性能分析工具的使用方法,包括查看线程状态、内存分配详情及实时监控资源和性能。通过具体命令行格式和示例,帮助读者掌握如何有效利用这些工具进行Java程序的性能调优。
摘要由CSDN通过智能技术生成

jstack、jmap、jstat

1. Jstack

jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示。在这里插入图片描述
注:这个和thread dump是同样的结果。但是thread dump是用kill -3 pid命令,还是服务器上面少用kill为妙。

1.1 命名行格式

jstack [ option ] pid 
jstack [ option ] executable core 
jstack [ option ] [server-id@]remote-hostname-or-IP 

最常用的还是jstack pid

1.2 在thread dump中,要留意下面几种状态

  • 死锁,Deadlock(重点关注)
  • 等待资源,Waiting on condition(重点关注)
  • 等待获取监视器,Waiting on monitor entry(重点关注)
  • 阻塞,Blocked(重点关注)
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,Object.wait() 或 TIMED_WAITING
  • 停止,Parked

2. Jmap

得到运行java程序的内存分配的详细情况。例如实例个数,大小等。

2.1 命令行格式

jmap [ option ] pid 
jmap [ option ] executable core 
jmap [ option ] [server-id@]remote-hostname-or-IP 

-dump:[live,]format=b,file=<filename> 使用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. 

2.2 示例
jmap -histo pid(查看实例)

$ jmap -histo 55126

 num     #instances         #bytes  class name
----------------------------------------------
   1:          2696       18147408  [B
   2:         72107        7164800  [C
   3:          1617        2149968  [I
   4:         71071        1705704  java.lang.String
   5:         30460        1329160  [Ljava.lang.Object;
   6:         24424         781568  java.util.HashMap$Node
   7:         12488         599424  gnu.trove.THashMap
   8:          3781         420352  java.lang.Class
   9:         12456         298944  org.jetbrains.jps.model.ex.JpsElementContainerImpl
  10:          8854         283328  java.util.concurrent.ConcurrentHashMap$Node
  11:           740         183472  [Ljava.util.HashMap$Node;
  12:          4954         158528  org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl
  13:          2866         137568  java.util.HashMap
  14:          7992         127872  java.lang.Object
  15:          3967         126944  java.io.File
  16:          4048          97152  org.jetbrains.jps.model.java.impl.JpsJavaDependencyExtensionImpl
  17:          3716          89184  org.jetbrains.jps.model.module.impl.JpsLibraryDependencyImpl
  18:          5426          86816  org.jetbrains.jps.model.impl.JpsProjectElementReference
  19:           959          84392  java.lang.reflect.Method
  20:          3359          80616  com.intellij.util.SmartList
  21:            56          72288  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  22:          1772          70880  java.lang.ref.Finalizer
  23:          1967          62944  org.jetbrains.jps.model.impl.JpsElementCollectionImpl
  24:          2549          61176  java.util.ArrayList
  25:          1250          50000  org.jetbrains.jps.incremental.artifacts.instructions.FileBasedArtifactRootDescriptor
  26:           631          45432  java.lang.reflect.Field
  27:          1404          44928  org.jetbrains.jps.model.library.impl.JpsLibraryRootImpl

jmap -dump:format=b,file=heap.bin pid(导出内存,据说对性能有影响,小心使用)
format=b是通过二进制的意思

3. Jstat

这是一个比较实用的一个命令,可以观察到classloader,compiler,gc相关信息。可以时时监控资源和性能。

3.1 命令格式

-class:统计class loader行为信息 
-compile:统计编译行为信息 
-gc:统计jdk gc时heap信息 
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况 
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件 
-gcnew:统计gc时,新生代的情况 
-gcnewcapacity:统计gc时,新生代heap容量 
-gcold:统计gc时,老年区的情况 
-gcoldcapacity:统计gc时,老年区heap容量 
-gcpermcapacity:统计gc时,permanent区heap容量 
-gcutil:统计gc时,heap情况 

3.2 输出参数内容

S0  — Heap上的 Survivor space 0 区已使用空间的百分比 
S0C:S0当前容量的大小 
S0U:S0已经使用的大小 
S1  — Heap上的 Survivor space 1 区已使用空间的百分比 
S1C:S1当前容量的大小 
S1U:S1已经使用的大小 
E   — Heap上的 Eden space 区已使用空间的百分比 
EC:Eden space当前容量的大小 
EU:Eden space已经使用的大小 
O   — Heap上的 Old space 区已使用空间的百分比 
OC:Old space当前容量的大小 
OU:Old space已经使用的大小 
P   — Perm space 区已使用空间的百分比 
OC:Perm space当前容量的大小 
OU:Perm space已经使用的大小 
YGC — 从应用程序启动到采样时发生 Young GC 的次数 
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) 
FGC — 从应用程序启动到采样时发生 Full GC 的次数 
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) 
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC 

3.3 示例
jstat -gc pid

$ jstat -gc 55126
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
10752.0 10752.0  0.0    0.0   65536.0  18435.3   122880.0   15341.9   21248.0 20582.4 2560.0 2299.6      3    0.038   1      0.061    0.099

jstat -gcutil pid

$ jstat -gcutil 55126
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  28.13  12.49  96.87  89.83      3    0.038     1    0.061    0.099

jstat -gc pid 100 5

$ jstat -gcutil 55126 100 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  28.13  12.49  96.87  89.83      3    0.038     1    0.061    0.099
  0.00   0.00  28.13  12.49  96.87  89.83      3    0.038     1    0.061    0.099
  0.00   0.00  28.13  12.49  96.87  89.83      3    0.038     1    0.061    0.099
  0.00   0.00  28.13  12.49  96.87  89.83      3    0.038     1    0.061    0.099
  0.00   0.00  28.13  12.49  96.87  89.83      3    0.038     1    0.061    0.099

jstat -gccapacity pid

$ jstat -gccapacity 55126
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 87040.0 238592.0  87040.0 10752.0 10752.0  65536.0   175104.0   478208.0   122880.0   122880.0      0.0 1069056.0  21248.0      0.0 1048576.0   2560.0      3     1

参考

三个实例演示 Java Thread Dump 日志分析
jstack(查看线程)、jmap(查看内存)和jstat(性能分析)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值