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利用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消耗时间分布、对象的创建情况、线程运行情况等。