JVM大家可能都知道是个什么玩意-Java虚拟机,但是到底是个什么鬼?相信即使工作3-5年的程序员可能也不大了解。
如题所述,今天与大家分享的是如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题。线程堆栈分析尽管不是初学者一门必备的技术,但是对于自身走向高程来说应该是必备的傍身技能。
哎...内存又溢出了,唉...?怎么突然CPU200%了等等一系列的问题都需要从线程堆栈中存储的信息找到问题所在。
JVM 线程堆栈
首先我们了解一下JVM 线程堆栈——它是什么?
JVM线程堆栈是一个给定时间的快照,它能向你提供所有被创建出来的Java线程的完整清单.
每一个被发现的Java线程都会给你如下信息:
– 线程的名称;经常被中间件厂商用来识别线程的标识,一般还会带上被分配的线程池名称以及状态 (运行,阻塞等等.)
– 线程类型 & 优先级,例如 : daemon prio=3 中间件程序一般以后台守护的形式创建他们的线程,这意味着这些线程是在后台运行的;它们会向它们的用户提供服务,例如:Java EE应用程序
– Java线程ID,例如 : tid=0x000000011e52a800 这是通过 java.lang.Thread.getId() 获得的Java线程ID,它常常用自增长的长整形 1..n 实现
– 原生线程ID,例如 : nid=0x251c ,原生线程ID可以让你获得诸如从操作系统的角度来看那个线程在你的JVM中使用了大部分的CPU时间等这样的相关信息
– Java线程状态和详细信息,例如: waiting for monitor entry [0xfffffffea5afb000] java.lang.Thread.State: BLOCKED (on object monitor)可以快速的了解到线程状态极其当前阻塞的可能原因
– Java线程栈跟踪;这是目前为止你能从线程堆栈中找到的最重要的数据. 这也是你花费最多分析时间的地方,因为Java栈跟踪向提供了你将会在稍后的练习环节了解到的导致诸多类型的问题的根本原因,所需要的90%的信息。
问题描述
linux系统下,线上环境Tomcat进程CPU突然飙升到200%
问题解决
查找对应Tomcat进程号
ps -ef|grep tomcat8_itstyle
导出堆栈信息,查询进程PID为8564
jstack -l 8564 > 8564.stack
下载8564.stack并打包为zip格式上传到GCeasy,生成分析报告如下:
吃不吃精,喜不喜欢,界面话报告分析,总有一项让你喜欢。
扩展阅读
jps命令
jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程以及进程id。 jps 也是一样,它的作用是显示当前系统的java进程情况及进程id。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),并可通过opt来查看这些进程的详细启动参数。
命令格式:jps [options ] [ hostid ]
[options]选项 :
-q:只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m:输出main method的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
jstack命令
命令格式:
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
常用参数说明
1)options:
executable Java executable from which the core dump was produced.(可能是产生core dump的java可执行程序)
core 将被打印信息的core dump文件
remote-hostname-or-IP 远程debug服务的主机名或ip
server-id 唯一id,假如一台主机上多个远程debug服务
2)基本参数:
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有栈信息.
-h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.