java 线上问题定位工具

在JDK的bin目录下有不少命令行工具:html

            

  咱们能够看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是由于这些工具大多数是jdk\lib\tools.jar类库的一层薄包装而已,他们的主要功能代码是在tools类库中实现的。命令行工具的好处是:当应用程序部署到生产环境后,不管是直接接触物理服务器仍是远程telnet到服务器上都会受到限制。而借助tools.jar类库里面的接口,咱们能够直接在应用程序中实现功能强大的监控分析功能。java

经常使用命令:

此次我主要介绍以下的一些使用工具:linux

一、jps:查看本机java进程信息。程序员

二、jstack:打印线程的栈信息,制做线程dump文件。web

三、jmap:打印内存映射,制做堆dump文件浏览器

四、jstat:性能监控工具服务器

五、jhat:内存分析工具多线程

六、jconsole:简易的可视化控制台工具

七、jvisualvm:功能强大的控制台性能

JAVA Dump:

JAVA Dump就是虚拟机运行时的快照,将虚拟机运行时的状态和信息保存到文件中:

线程dump:包含全部线程的运行状态,纯文本格式

堆dump:包含全部堆对象的状态,二进制格式

java dump能够在任何java环境使用,信息量充足,针对非功能性性的bug,主要为多线程开发、内存泄漏。

1、JPS

显示当前全部java进程pid的命令,咱们能够经过这个命令来查看到底启动了几个java进程(由于每个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其余用户的还只能用linux的ps命令。

执行jps命令,会列出全部正在运行的java进程,其中jps命令也是一个java程序,前面的数字就是对应的进程id,这个id的做用很是大,后面会有相关介绍。

jps -help:

jps -l 输出应用程序main.class的完成package名或者应用程序jar文件完整路径名

jps -v 输出传递给JVM的参数

JPS失效

咱们在定位问题过程会遇到这样一种状况,用jps查看不到进程id,用ps -ef | grep java却能看到启动的java进程。

要解释这种现象,先来了解下JSP的实现机制:

java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,所以jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。

咱们来思考下:若是因为磁盘满了,没法建立这些文件,或者用户对这些文件没哟读的权限。又或者由于某种缘由这些文件或者目录被清除,出现以上这些状况,就会致使jps命令失效。

若是jps命令失效,而咱们又要获取pid,还可使用如下两种方法:

一、top | grep java

二、ps -ef |grep java

2、jstack

主要用于生成虚拟机当前时刻的线程快照,线程快照是当前java虚拟机每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现长时间停顿的缘由,如线程间死锁、死循环、请求外部资源致使长时间等待。

使用命令打印堆栈很简单,可是经过堆栈文件定位问题,须要很深厚的内功,这也是体现一个程序员的价值的一个方面。对于堆栈文件的分析思路,这里不展开介绍,后面我会有专门介绍定位性能问题的文章。

3、Jmap

主要用于打印指定java进程的共享对象内存映射或堆内存细节。

堆Dump是反映堆使用状况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、全部类和对象的状态等。通常在内存不足,GC异常等状况下,咱们会去怀疑内存泄漏,这个时候就会去打印堆Dump。

jmap的用法摘要:

一、jmap pid

打印的信息分别为:共享对象的起始地址、映射大小、共享对象路径的全程。

二、jmap -heap pid:查看堆使用状况

 

三、jmap -histo pid:查看堆中对象数量和大小

打印的信息分别是:序列号、Class实例的数量、内存的占用、类限定名

若是是内部类,类名的开头会加上*,若是加上live子参数的话,如jmap -histo:live pid,这个命名会触发一次FUll GC,只统计存活对象

四、jmap -dump:format=b,file=heapdump pid:将内存使用的详细状况输出到文件

     而后使用jhat命令查看该文件:jhat -port 4000 文件名 ,在浏览器中访问http:localhost:4000/

总结:

该命令适用的场景是程序内存不足或者GC频繁,这时候极可能是内存泄漏。经过以上命令查看堆使用状况、大量对象被持续引用等状况。

4、Jstat

主要是对java应用程序的资源和性能进行实时的命令行监控,包括了对heap size和垃圾回收情况的监控。

 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

option:咱们常用的选项有gc、gcutil

vmid:java进程id

interval:间隔时间,单位为毫秒

count:打印次数

一、jstat -gc PID 5000 20

S0C:年轻代第一个survivor的容量(字节)

S1C:年轻代第二个survivor的容量(字节)

S0U:年轻代第一个survivor已使用的容量(字节)

S1U:年轻代第二个survivor已使用的容量(字节)

EC:年轻代中Eden的空间(字节)

EU:年代代中Eden已使用的空间(字节)

OC:老年代的容量(字节)

OU:老年代中已使用的空间(字节)

PC:永久代的容量

PU:永久代已使用的容量

YGC:从应用程序启动到采样时年轻代中GC的次数

YGCT:从应用程序启动到采样时年轻代中GC所使用的时间(单位:S)

FGC:从应用程序启动到采样时老年代中GC(FULL GC)的次数

FGCT:从应用程序启动到采样时老年代中GC所使用的时间(单位:S)

二、jstat -gcutil PID 5000 20

s0:年轻代中第一个survivor已使用的占当前容量百分比

s1:年轻代中第二个survivor已使用的占当前容量百分比

E:年轻代中Eden已使用的占当前容量百分比

O:老年代中已使用的占当前容量百分比

P:永久代中已使用的占当前容量百分比

5、Jhat

主要用来解析java堆dump并启动一个web服务器,而后就能够在浏览器中查看堆的dump文件了。

生成dump文件的方法前面已经介绍了,这边主要介绍如何解析java堆转储文件,并启动一个web server

jhat heapdump

这个命令将heapdump文件转换成html格式,而且启动一个http服务,默认端口为7000。

若是端口冲突,可使用如下命令指定端口:jhat -port 4000 heapdump

下面咱们来访问下:ip:port

该页面提供了几个查询功能,其中查看堆栈异常状况主要看其中两个查询:

一、

二、

相关文章
相关标签/搜索