jps
作用:查看所有的jvm进程,包括进程ID,进程启动的路径等等
原理:java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/),有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。
常用命令:
jps
# 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
jps -q
# 输出传递给main 方法的参数
jps -m
# 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
jps -l
# 输出传递给JVM的参数
jps -v
jstat
作用:jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
常用命令:
#命令格式
jstat -
jmap
作用:主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump。
备注: 最好不要在生产环境下使用
常用命令:
#查看java 堆(heap)使用情况
jmap -heap pid
#查看堆内存(histogram)中的对象数量及大小 如果jmap -histo:live 这个命令执行,JVM会先触发gc(生产慎用),然后再统计信息。
jmap -histo pid
#这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。
jmap -dump:format=b,file=heapDump pid
Jhat
jstack
作用:观察jvm中当前所有线程的运行情况和线程当前状态;系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。系统hang 住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hang的状态,jstack是非常有用的。
线程状态:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。
调用修饰:
表示线程在方法调用时,额外的重要的操作。线程Dump分析的重要信息。修饰上方的方法调用。
locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。
waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在迚入区等待。
waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待。
parking to wait for <地址> 目标
线程动作:
线程状态产生的原因
runnable:状态一般为RUNNABLE。
in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。
waiting for monitor entry:进入区等待,状态为BLOCKED。
waiting on condition:等待区等待、被park。
sleeping:休眠的线程,调用了Thread.sleep()。
可能看的出来的异常:
wait on monitor entry: 被阻塞的,肯定有问题 (BLOCKED(on object monitor )--- waiting to lock)
runnable : 注意IO线程[常见的jdbc连接阻塞]
in Object.wait(): 注意非线程池等待 [WAITING (on object monitor)]
常用指令:
#查看
jstack [-l|-m|-F] pid
如何分析线程dump:
原则:
结合代码阅读的推理。需要线程Dump和源码的相互推导和印证。
造成Bug的根源往往会在调用栈上直接体现,一定格外注意线程当前调用之前的所有调用。