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状态。

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

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

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

2、生成dump文件

jstack 1>2dump

3、查看是否有锁

grep State 2dump| awk '{print $2$3$4$5}' | sort | uniq -c

或者按照文件:

先生成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     -----查看进程号

jstack pid    ----查看进程号为1的线程信息

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

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

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

执行以下任意命令,查看并记录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使用详解 - 陈咬金 - 博客园

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值