jstack, jstat, jmap, jinfo, 教你如何在背后偷窥你的进程

http://blog.csdn.net/fenglibing/article/details/6411953

jps

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

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

1)jps
列出pid和java主类名
2)jps -l
列出pid和java主类全称
3)jps -lm
列出皮带、主类全称和应用程序参数
4)jps -v
列出pid和JVM参数

 

 

 

jstack

观察jvm中当前所有线程的运行情况和线程当前状态。

系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。

系统hung住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。

第一步先找出Java进程ID,服务器上的Java应用名称为mrf-center:

root@ubuntu:/# ps -ef | grep mrf-center | grep -v grep
root     21711     1  1 14:47 pts/3    00:02:10 java -jar mrf-center.jar
得到进程ID为21711,第二步找出该进程内最耗费CPU的线程,可以使用
1)ps -Lfp pid
2)ps -mp pid -o THREAD, tid, time
3)top -Hp pid
用第三个,输出如下:

TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用

printf "%x\n" 21742

得到21742的十六进制值为54ee,下面会用到。

OK,下一步终于轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下:

root@ubuntu:/# jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait()

可以看到CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait()

 

jstat

jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;

特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。

S0  — Heap上的 Survivor space 0 区已使用空间的百分比
S1  — Heap上的 Survivor space 1 区已使用空间的百分比
E   — Heap上的 Eden space 区已使用空间的百分比
O   — Heap上的 Old space 区已使用空间的百分比
P   — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

实例使用1:

[root@localhost bin]# jstat -gcutil 25444

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT

 11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579

 

jmap

监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;

系统崩溃了?jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等

 

-dump

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

 

[root@localhost jdk1.7.0_79]# jmap -dump:live,format=b,file=dump.hprof 24971
Dumping heap to /usr/local/java/jdk1.7.0_79/dump.hprof ...
Heap dump file created

 

-heap

打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况 

 

[root@localhost jdk1.7.0_79]# jmap -heap 24971
Attaching to process ID 24971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
 
using thread-local object allocation.
Parallel GC with 4 thread(s)
 
Heap Configuration:
   MinHeapFreeRatio = 0
   MaxHeapFreeRatio = 100
   MaxHeapSize      = 4146069504 (3954.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)
   G1HeapRegionSize = 0 (0.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
   capacity = 517996544 (494.0MB)
   used     = 151567520 (144.54605102539062MB)
   free     = 366429024 (349.4539489746094MB)
   29.26033421566612% used
From Space:
   capacity = 41943040 (40.0MB)
   used     = 0 (0.0MB)
   free     = 41943040 (40.0MB)
   0.0% used
To Space:
   capacity = 40370176 (38.5MB)
   used     = 0 (0.0MB)
   free     = 40370176 (38.5MB)
   0.0% used
PS Old Generation
   capacity = 115343360 (110.0MB)
   used     = 32927184 (31.401809692382812MB)
   free     = 82416176 (78.59819030761719MB)
   28.54709972034801% used
PS Perm Generation
   capacity = 85983232 (82.0MB)
   used     = 54701200 (52.16712951660156MB)
   free     = 31282032 (29.832870483398438MB)
   63.6184506300019% used
 
20822 interned Strings occupying 2441752 bytes.
-histo

 

打印堆的对象统计,包括对象数、内存大小等等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

 

[root@localhost jdk1.7.0_79]# jmap -histo:live 24971 | more
 
 num     #instances         #bytes  class name
----------------------------------------------
   1:        100134       14622728  <constMethodKlass>
   2:        100134       12830128  <methodKlass>
   3:         88438       12708392  [C
   4:          8271       10163584  <constantPoolKlass>
   5:         27806        9115784  [B
   6:          8271        6225312  <instanceKlassKlass>
   7:          6830        5632192  <constantPoolCacheKlass>
   8:         86717        2081208  java.lang.String
   9:          2264        1311720  <methodDataKlass>
  10:         10880         870400  java.lang.reflect.Method
  11:          8987         869888  java.lang.Class
  12:         13330         747264  [[I
  13:         11808         733872  [S
  14:         20110         643520  java.util.concurrent.ConcurrentHashMap$HashEntry
  15:         18574         594368  java.util.HashMap$Entry
  16:          3668         504592  [Ljava.util.HashMap$Entry;
  17:         30698         491168  java.lang.Integer
  18:          2247         486864  [I
  19:          7486         479104  java.net.URL
  20:          8032         453616  [Ljava.lang.Object;
  21:         10259         410360  java.util.LinkedHashMap$Entry
  22:           699         380256  <objArrayKlassKlass>
  23:          5782         277536  org.apache.catalina.loader.ResourceEntry
  24:          8327         266464  java.lang.ref.WeakReference
  25:          2374         207928  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
  26:          3440         192640  java.util.LinkedHashMap
  27:          4779         191160  java.lang.ref.SoftReference
  28:          3576         171648  java.util.HashMap
  29:         10080         161280  java.lang.Object
 

 

 

jinfo

观察进程运行环境参数,包括Java System属性和JVM命令行参数

系统崩溃了?jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。

 

jinfo [option] <pid>
会输出所有参数
[root@www root]# jinfo 15525

下面是输出所有可修改的参数
[root@www root]# java -XX:+PrintFlagsFinal -version|grep manageable

开启gc日志:
[root@www root]# jinfo -flag+PrintGCDetails 12278
[root@www root]# jinfo -flag+PrintGC 12278

关闭gc日志:
[root@www root]# jinfo -flag -PrintGCDetails 12278
[root@www root]# jinfo -flag -PrintGC 12278
 

 

 

备注

如果能熟练运用这些命令,尤其是在linux下,那么完全可以代替jprofile等监控工具。

用命令的好处就是速度快,并且辅助于其他命令,比如grep gawk sed等,可以组装多种符合自己需求的工具。

JProfiler:可图形展示CPU消耗时间分布、对象的创建情况、线程运行情况等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值