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

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

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

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

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 2000 100 # 每2秒输出一次内存情况,连续输出100次
jstat -gc 输出heap各个分区大小

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

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

 jstat -gc  1 2s  10000  # 每2秒输出一次pid为1的内存情况,连续输出10000次

top查看系统cpu及内存占用情况:

JVM内存分析工具jstack,jstat与jmap的使用_第1张图片

1、top 命令查看卡死线程ID为1

2、生成dump文件

jstack 1>2dump

3、查看是否有锁

grep State 2dump| awk '{print $2$3$4$5}' | sort | uniq -c
JVM内存分析工具jstack,jstat与jmap的使用_第2张图片

或者按照文件:

先生成log文件

jstack pid >js.log       ----将进程pid线程输出到js.log文件中
grep "com.rade.social.service.remote"  js.log | sort | uniq -c   ----详细线程,在js.log文件中搜索关键字"com.rade.social.service.remote"取重详细信息


  
   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

简单使用总结:

jps     -----查看进程号

JVM内存分析工具jstack,jstat与jmap的使用_第3张图片jstack pid    ----查看进程号为1的线程信息

JVM内存分析工具jstack,jstat与jmap的使用_第4张图片

jstack pid >js.log       ----将进程pid线程输出到js.log文件中
grep "Thread.State" js.log | wc -l   ----线程总数,在js.log文件中搜索关键字"Thread.State"总数

JVM内存分析工具jstack,jstat与jmap的使用_第5张图片

grep "com.rade.social.service.remote" js.log | wc -l ----线程中有方法"com.rade.social.service.remote"的执行总数

jmap -heap  pid  ----查看pid的进程内存使用情况: 

JVM内存分析工具jstack,jstat与jmap的使用_第6张图片

执行以下任意命令,查看并记录JAVA进程的PID。

ps -ef |grep java
jps -lm

执行以下命令,查看堆栈信息。

jstack -l pid > /tmp/pid.jstack

执行以下命令,查看ConsumeMessageThread的信息

cat /tmp/pid.jstack|grep ConsumeMessageThread -A 10 --color

推荐文章:

内存泄漏检测分析工具MAT(Memory Analyzer Tool)的使用_alcoholdi的专栏-CSDN博客

Mat使用详解 - 陈咬金 - 博客园

你可能感兴趣的:(学习技巧,java相关,java)