jstack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做些什么?在等待什么资源等!其运行格式如下:
1.jstack命令的语法格式: jstack
1. 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的,不同的 JVM版本, dump信息也有差别。本文中,只以 SUN的 hotspot JVM 5.0_06 为例。
2. 在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。
jstack——发现线程目前停留在那行代码
jstack
jstack -F
jstack -F -l pid (查出某个进程中运行的所有线程)
生成进程下所有线程的栈日志:jstack
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
jstat -gc
对于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 >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使用详解 - 陈咬金 - 博客园