java 调试命令

jps

输出JVM中运行的进程状态信息

jps [-q] [-mlvV] [<hostid>]
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数

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方法)

ps、top、printf、jstack、grep 等联合使用可以定位到线程堆栈和具体执行代码。例如查找某个 java 进程中 cpu 消耗最多的 java 线程,并定位堆栈信息。

  1. ps 查找 java 进程 pid
  2. top 查找 java 进程最耗费 cpu 的线程
top -Hp pid
-H 显示线程信息
-p 指定进程
  1. 找到线程 id 后转化成十六进制
printf "%x\n" thread-id
  1. jstack 定位堆栈
jstack pid | grep thread-id-ox -A 5

jmap(Memory Map) and jhat(Java Heap Analysis Tool)

jmap用来查看堆内存使用状况,一般结合jhat使用。

jmap [option] pid
jmap [option] executable core
jmap [option] [server-id@]remote-hostname-or-ip

打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息:

jmap -permstat pid

查看进程堆内存使用情况,包括使用的 GC 算法、堆配置参数和各代中堆内存使用情况:

jmap -heap pid

查看堆内存中的对象数目、大小统计直方图:

jmap -histo[:live] pid

版权声明:本文为yuchuanchen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。