IT干货网

jdk分析工具:jps和jstack

xmjava 2022年03月15日 编程设计 161 0

jps

用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。使用jps时,不需要传递进程号做为参数。

Jps也可以显示远程系统上的JAVA进程,这需要远程服务上开启了jstat服务,以及RMI注及服务,不过常用都是对本对的JAVA进程的查看。

命令格式

jps [ options ] [ hostid ]

常用参数说明

-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。

-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。

-v 输出传给JVM的参数。

使用示例

复制代码
blue@blue-pc:~$ jps 
8710 Jps 
5661 Bootstrap 
2491  
2967  
blue@blue-pc:~$ jps -ml 
5661 org.apache.catalina.startup.Bootstrap start 
2491  
8724 sun.tools.jps.Jps -ml 
2967  
blue@blue-pc:~$ jps -mlv 
5661 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/home/blue/apache-tomcat-7.0.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/blue/apache-tomcat-7.0.39/endorsed -Dcatalina.base=/home/blue/apache-tomcat-7.0.39 -Dcatalina.home=/home/blue/apache-tomcat-7.0.39 -Djava.io.tmpdir=/home/blue/apache-tomcat-7.0.39/temp 
2491  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx384m 
8738 sun.tools.jps.Jps -mlv -Dapplication.home=/usr/local/jdk1.6.0_35 -Xms8m 
2967  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m
复制代码

前面的数字是jvm的进程id,后面是jvm的类启动信息。

jstack

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

命令格式

$jstack [ option ] pid

$jstack [ option ] executable core

$jstack [ option ] [server-id@]remote-hostname-or-IP

常用参数说明

OPTIONS


-F jstack [-l] pid无法响应时,强制打印堆栈

-l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m 混合模式输出(包括java和本地c/c++片段)堆栈。

pid: java应用程序的进程号,一般可以通过jps来获得;

executable:产生core dump的java可执行程序;

core:打印出的core文件;

remote-hostname-or-ip:远程debug服务器的名称或IP;

server-id: 唯一id,假如一台主机上多个远程debug服务;

使用示例

复制代码
blue@blue-pc:~$ jps -ml 
5661 org.apache.catalina.startup.Bootstrap  
blue@blue-pc:~$ jstack 5661 
2013-04-16 21:09:27 
Full thread dump Java HotSpot(TM) Server VM (20.10-b01 mixed mode): 
 
"Attach Listener" daemon prio=10 tid=0x70e95400 nid=0x2265 waiting on condition [0x00000000] 
   java.lang.Thread.State: RUNNABLE 
 
"http-bio-8080-exec-20" daemon prio=10 tid=0x08a35800 nid=0x1d42 waiting on condition [0x70997000] 
   java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for  <0x766a27b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) 
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104) 
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662)
........
复制代码

一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

solr课程学习系列-solr的概念与结构(1)