讲解几个JDK自带命令的用法(顺序从使用频率由高到低):
1. jstat
此命令是用来查看tomcat的运行情况的
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数 | 说明 |
Options | 选项,我们一般使用 -gcutil 查看GC情况 |
vmid | VM的进程号,即当前运行的java进程号 |
interval | 间隔时间,单位为秒或者毫秒 |
count | 打印次数,如果缺省则打印无数次 |
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 — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
简单了解JDK的GC运行原理后,会对以上参数更加理解。
一般,我们只需要看Old space的百分比,如果这个数值异常偏高那就需要好好检查一下啦。
2. jstack
使用该命令可以在控制台直接打印出堆栈信息
jstack -F [-m] [-l] <pid>
参数 | 说明 |
-F | 强制输出堆栈信息(使用jstack <pid>命令没有得到响应的时候使用 ) |
-m | to print both java and native frames (mixed mode) |
-l | long listing. Prints additional information about locks |
这个命令还可以输出为文件,如下:
jstack 22899 > /home/appuser/stacklogs/22899.log
结合jstack和top这两个命令可以找到当前占用CPU或内存最高的线程堆栈信息,具体做法下面会讲。
3. jmap
打印或输出指定java进程的堆信息
jmap [option] <pid>
参数 说明 -heap 在控制台打印出java堆的信息,包括配置的内存大小和运行情况 -histo[:live] 模拟柱状图的方式打印堆里的对象信息,包括个数和占用的内存.加上":live"则只打印存活的对象 -dump:<dump-options>
将堆信息以二进制文件dump下来。
dump-options包含以下三个参数:
live 只打印存活的对象
format=b 二进制转换
file=<file> dump文件的路径
eg: jmap -dump:live,format=b,file=heap.map <pid>
-F 在使用参数dump或histo后进程没有响应的情况下强制生成堆信息
jmap -dump:live,file=d://7212.map 7212
我一般使用这个命令生成jmap文件,然后使用eclipse的MemoryAnalyzer工具作分析
jmap命令的CPU消耗很大,建议大家熟练后再去生产环境使用.
=====================2016年3月10日 这是分隔线唷==========================
使用jstack找出占用CPU较高的线程
工具: jstack , top , 可以将十进制转换为十六进制的计算器(这个有点中二
1. top得到占用最高的进程号为12335
2. 使用top -p 12335 -H得到占用CPU最高的线程号为12358
3. 将12358由十进制转为十六进制得到nid: 3046(注1),通过nid在jstack生成的堆记录中就能查找到对应的线程啦。
不过我觉得这个方式有点中二,如果你想抓取造成瞬时对CPU占用高的线程是根本不可能的,因为你要进行这么多步才能找到对应的nid,可能在你找到nid的时候占用CPU高的任务已经跑完了呢。 ╮( ̄▽ ̄")╭
注1: linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程;我们看到,占用CPU资源最高的那个进程id是’15417′,这个进程id对应java线程信息中的’nid’(‘n’ stands for ‘native’);
--摘自《Linux下Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈》 http://www.geek521.com/?p=7649
参考博文链接:
《JDK之jstat的用法》http://www.51testing.com/html/92/77492-203728.html
《JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解》
http://my.oschina.net/feichexia/blog/196575?fromerr=RYyZOXW2