通过JDK自带的命令解决程序运行缓慢,tomcat内存泄露问题(待续)
2016-03-10 11:12
513 查看
摘要: 通过JDK自带的命令解决程序运行缓慢,tomcat内存泄露问题
讲解几个JDK自带命令的用法(顺序从使用频率由高到低):
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的百分比,如果这个数值异常偏高那就需要好好检查一下啦。
这个命令还可以输出为文件,如下:
结合jstack和top这两个命令可以找到当前占用CPU或内存最高的线程堆栈信息,具体做法下面会讲。
我一般使用这个命令生成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
讲解几个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
相关文章推荐
- 手动删除webapps下项目,导致Document base %TOMCAT_HOME%\webapps\XXX does not exist or is not a readable directory
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- Tomcat6标准日志,按天输出日志,并禁止catalina.out文件[tomcat中catalina.out日志时间久变得很大]
- tomcat原理
- Eclipse集成Tomcat的配置步骤实例
- tomcat配置gzip压缩与解压缩
- JDK和Tomcat官网下载,包含各个历史版本
- Starting Tomcat v6.0 Server at localhost' has encountered a problem,Several ports (8005, 8080, 8009)
- 阿里云使用笔记-Tomcat安装-centos7
- Tomcat 系统架构与设计模式
- tomcat占用jvm内存数修改方法及监控方法
- 切割 Tomcat 的 catalina.out 文件,解决日志文件过大的问题
- centos7 安装部署jdk环境及tomcat
- tomcat配置及nginx反代至tomcat(二)
- Tomcat6.0数据库连接池配置
- eclipse部署web项目至本地的tomcat但在webapps中找不到
- 关于tomcat版本造成的404的解决办法
- tomcat nio与bio压测对比
- Tomcat配置DataSource
- wifi下的android手机访问tomcat