1. JPS
jps工具位于%JAVA_HOME%\bin目录下,用于显示所有java进程pid的命令,适合在linux/unix平台上查看当前java进程的一些简单情况。
java程序启动后,会在java.ip.tmpdir目录下,产生一个hsperfdata_username的文件夹,每一个java进程都会在该文件夹下生成一个以java pid为文件名的文件,文件内容包含一系列进程详情。所以jps命令的执行只是简单列出文件夹所有文件名称和解析文件内容显示而已。
但是jps只能查看当前用户下启动的java进程
jps参数
- -q 不显示class名称,jar文件名和传递给main 方法的参数
- -m 输出传递给main 方法的参数
- -l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
- -v 输出传递给JVM的参数
例:
2. jstack
jstack主要用来查看某个Java进程内的线程堆栈信息。其用法如下:
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
相关参数如下:
- -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
- -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
jstack可以导出线程堆栈,通过线程堆栈可以定位到具体代码。
线上报警的基本处理方案:
- jps -l 得到java进行的进程id(13176)
- top -H -p 13176 获得进程13176的线程占用资源情况
- 按cpu使用情况排序(shift + p),观察线程占用cpu情况,得到最耗用CPU的线程id为20296
- dump出线程堆栈信息, jstack 13176 >> jstack.log
- 查找最耗cpu的线程的堆栈情况,printf '%x' 20296 (4f48)
- 根据4f48查看堆栈的信息,定位具体代码分析问题