您的位置:首页 > 运维架构 > Tomcat

通过JDK自带的命令解决程序运行缓慢,tomcat内存泄露问题(待续)

2016-03-10 11:12 513 查看
摘要: 通过JDK自带的命令解决程序运行缓慢,tomcat内存泄露问题

讲解几个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: