JVM内存分析工具jstack,jstat与jmap的使用

jstack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做些什么?在等待什么资源等!其运行格式如下:
1.jstack命令的语法格式: jstack  <pid>。可以用jps查看java进程id。这里要注意的是:
1. 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的,不同的 JVM版本, dump信息也有差别。本文中,只以 SUN的 hotspot JVM 5.0_06 为例。
2. 在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。 

jstack——发现线程目前停留在那行代码 
jstack <PID>
jstack -F <PID> # 有时候线程挂起的时候要加上-F参数才能把信息dump处理
jstack -F -l pid (查出某个进程中运行的所有线程)
生成进程下所有线程的栈日志:jstack <PID> > test.txt
 

2.jmap
#提取进程内存信息,用于分析OOM导致原因如下,其中(format=b是通过二进制的意思)
jmap -dump:format=b,file=HeapDump.bin <pid>
#输出堆信息
jmap -heap <PID>
 

jhat简单分析内存中对象情况
#读取dump文件,生成报告,并启动WEB服务器,默认端口为7000
jhat -J-mx768m -stack false HeapDump.bin 

# 访问报告,需要打开浏览器访问其7000端口,页面底下的汇总信息有些帮助的
Show instance counts for all classes (including platform) 
Show instance counts for all classes (excluding platform) 
Show heap histogram

jmap用来查看进程堆内存使用状况,一般结合jhat或者eclipce内存分析工具分析使用。
 用jmap把进程内存使用情况dump到文件中,再用jhat或者eclipce内存分析工具分析查看。jmap进行dump命令格式如下(21711为进程id可以使用netstat或者ps命令查到):
 jmap -F -dump:format=b,file=test.dump 21711
 使用jhat查看内存文件
 linux执行:jhat -port 9998 /tmp/dump.dat
 然后就可以在浏览器中输入主机地址:9998查看了
  使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
  jmap -heap 21711
 我们通过JVM启动时加入启动参数 –XX:HeapDumpOnOutOfMemoryError参数,可以让JVM在出现内存溢出错误的时候自动生成dump文件,亦可以通过-XX:HeapDumpOnCtrlBreak参数,在运行时使用ctrl+break按键生成dump文件,当然我们也可以使用kill -3 pid的方式去恐吓JVM生成dump文件。jmap的作用不仅仅是为了获取dump文件,还可以用于查询finalize执行队列、Java堆和永久带的详细信息,如空间使用率、垃圾回收器等。

3.jstat 是一个比较实用的一个命令,可以观察到classloader,compiler,gc相关信息。可以时时监控资源和性能
jstat -gcutil <pid> 2000 100 # 每2秒输出一次内存情况,连续输出100次
jstat -gc<pid> 输出heap各个分区大小

对于jstack日志,我们要着重关注如下关键信息
Deadlock:表示有死锁
Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待
Blocked:阻塞
Waiting on monitor entry:在等待获取锁

如果说系统慢,那么要特别关注Blocked,Waiting on condition
如果说系统的cpu耗的高,那么肯定是线程执行有死循环,那么此时要关注下Runable状态。

 
  
   vmid是虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:
   jstat -gc 21711 250 4
   Linux下面查看占用cpu高的进程:top
   生成进程下所有线程的栈日志:jstack 1721 > 1712.txt
   查看进程下哪些线程占用了高的cpu:top -p 1712 -H

猜你喜欢

转载自blog.csdn.net/zpflwy1314/article/details/95382353