java jstack命令


 

jstack 应用

首先通过:ps -ef|grep java

得到java pid

查看哪个线程占用最多资源:

找出该进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid  命令查看这个进程下面的所有线程占用情况。

 

发现线程21742占用最多。

 

将刚刚发现占用cpu最多的线程id(21742)换算成16进制

命令:printf "%x\n" 21742 的到 线程值 :54ee

查看jstack 生成的文件:

jstack pid | grep tid

如:jstack 21711 | grep 54ee

下面可以看出是哪行代码导致,查看那行代码发现有死循环。跟踪解决完毕。

 

 ---------------------------------------------------------------

 jps主要用来输出JVM中运行的进程状态信息。语法格式如下:

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

[prdps@prdpsdev001iad bin]$ jps -m -l
48893 com.valueclickbrands.hybrid.HybridApiStart
57367 com.pricerunner.hybrid.HybridPageStart
57481 com.pricerunner.hybrid.HybridPageStart

 

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

 第一步先找出Java进程ID,我部署在服务器上的Java应用名称为HybridApiStart:

[prdps@prdpsdev001iad bin]$ ps -ef|grep java|grep HybridApiStart|grep -v grep
prdps 48893 1 0 Jan27 ? 00:00:55 /ask/prun/dps/AllApp/Hybrid/jdk/bin/。。。。

 

第二步找出该进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我这里用第三个,输出如下:

[prdps@prdpsdev001iad bin]$ top -Hp 48893

top - 04:29:29 up 407 days, 2:00, 5 users, load average: 0.00, 0.04, 0.09
Tasks: 102 total, 0 running, 102 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 65957312k total, 24918236k used, 41039076k free, 2608264k buffers
Swap: 1048568k total, 8060k used, 1040508k free, 14009316k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21742 prdps 20 0 36.5g 1.7g 144m S 0.0 2.8 0:00.02 java
48896 prdps 20 0 36.5g 1.7g 144m S 0.0 2.8 0:05.14 java

 

    TIME列就是各个Java线程耗费的CPU时间,选一个线程ID为21742的线程,用

  printf "%x\n" 21742

    得到21742的十六进制值为54ee,下面会用到。    

    OK,下一步终于轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下:

  jstack 21711 | grep 54ee

  就能看到结果了;

 

C、 jmap(Memory Map)和jhat(Java Heap Analysis Tool)

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

    jmap语法格式如下:

jmap [option] pid
jmap [option] executable core
jmap [option] [server- id @]remote- hostname -or-ip
 
jmap -permstat pid
打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息。
 
使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
 
使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
 

D、jstat(JVM统计监测工具)

    语法格式如下:

  jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

    vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:

  jstat -gc 21711 250 4

 

参见:http://my.oschina.net/feichexia/blog/196575


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM