jps 命令相似与 linux 的 ps 命令,可是它只列出系统中全部的 Java 应用程序。 经过 jps 命令能够方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息。java
-q:只输出进程 ID
-m:输出传入 main 方法的参数
-l:输出彻底的包名,应用主类名,jar的彻底路径名
-v:输出jvm参数
-V:输出经过flag文件传递到JVM中的参数linux
一、jps 显示进程的ID 和 类的名称服务器
二、jps -q 只输出进程ID,而不显示出类的名称jvm
三、jps -m 能够输出传递给 Java 进程(main 方法)的参数
四、jps -l 能够输出主函数的完整路径(类的全路径)
五、 jps -v 能够显示传递给 Java 虚拟机的参数ide
jps 支持查看远程服务上的 jvm 进程信息。若是须要查看其余机器上的 jvm 进程,须要在待查看机器上启动 jstatd 服务。函数
jstack是jdk自带的线程堆栈分析工具,使用该命令能够查看或导出 Java 应用程序中线程堆栈信息。工具
举例:若是CPU负荷达到100%,咱们如何排查?线程
top -Hp 23344(进程ID)
这里注意:
jstack命令生成的thread dump信息包含了JVM中全部存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?code
能够看到,jstack里面,每个线程都对应一个nid,这个nid是16进制的。
一、把要查看的pid转换成16进制,进行匹配便可找到要查看的线程的信息。
二、而后能够多打印几回jstack信息,这样找到这个线程在哪一段代码,出现的频率最高,而后查看线程状态。blog
三、在dump中,线程通常存在以下几种状态:
3.一、RUNNABLE,线程处于执行中
3.二、BLOCKED,线程被阻塞
3.三、WAITING,线程正在等待
四、举例:死锁
package com.jane; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) { ReentrantLock lock1 = new ReentrantLock(); ReentrantLock lock2 = new ReentrantLock(); Thread t1 = new Thread() { @Override public void run() { try { lock1.lock(); TimeUnit.SECONDS.sleep(1); lock2.lock(); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t2 = new Thread() { @Override public void run() { try { lock2.lock(); TimeUnit.SECONDS.sleep(1); lock1.lock(); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.setName("mythread1"); t2.setName("mythread2"); t1.start(); t2.start(); } }
两个线程在互相等待另外一个线程的锁!!