JVM性能分析工具jstack介绍

JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外, 还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一种工具都有其自身的特点, 用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测, 先通过一个表格形式简要介绍下这几个命令的作用和使用方法。本文重点介绍jstack的使用方法。

命令 作用
jps 基础工具
jstack 查看某个Java进程内的线程堆栈信息
jmap jmap导出堆内存,然后使用jhat来进行分析
jhat jmap导出堆内存,然后使用jhat来进行分析
jstat JVM统计监测工具
hprof hprof能够展现CPU使用率,统计堆内存使用情况

jps使用

可以列出本机所有java进程的pid

选项

  • -q 仅输出VM标识符,不包括class name,jar name,arguments in main method
  • -m 输出main method的参数
  • -l 输出完全的包名,应用主类名,jar的完全路径名
  • -v 输出jvm参数
  • -V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
  • -Joption 传递参数到vm,例如:-J-Xms48m

示例:

12345678
[[email protected] board-api]# jps -lvm67136 board-api-1.0.0-SNAPSHOT.jar --spring.config.location=application.yml -Xms1024m -Xmx1024m100547 board-web-1.0.0-SNAPSHOT.jar --spring.config.location=application.yml -Xms512m8819 app-manage-api-1.0.0-SNAPSHOT.jar --spring.config.location=application.yml -Xms512m120226 adm-web-1.0.0-SNAPSHOT.jar --spring.config.location=file:./application.yml -Xms512m105268 wechat-api-1.0.0-SNAPSHOT.jar --spring.config.location=application.yml -Xms512m89172 sun.tools.jps.Jps -lvm -Denv.class.path=.:/usr/local/jdk/lib/dt.jar:/usr/local/jdk/lib/tools.jar:/usr/local/jdk/jre/lib -Dapplication.home=/usr/local/jdk -Xms8m44921 app-manage-1.0.0-SNAPSHOT.jar --spring.config.location=file:./application.yml -Xms512m -Xmx1024m

我们选取PID=67136的Java进程作为后续研究对象。

top使用

除了常用的打印所有进程使用资源外,还可以对单独的进程,打印线程资源排行榜,按T键可对TIME倒序排列, 也就是CPU运行时间。TIME列就是各个Java线程耗费的CPU时间,我们线程pid为67163的线程作为后续线程研究对象

123456789101112131415161718192021222324
[[email protected] board-api]# top -Hp 67136top - 11:22:26 up 166 days, 17:06,  1 user,  load average: 0.07, 0.02, 0.00Tasks: 140 total,   0 running, 140 sleeping,   0 stopped,   0 zombieCpu(s):  0.1%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%stMem:  16309360k total, 16120904k used,   188456k free,   174440k buffersSwap:  8175612k total,   461868k used,  7713744k free,  7831512k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 67163 root      20   0 6825m 867m  14m S  2.0  5.4  16:22.87 java 67136 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.00 java 67137 root      20   0 6825m 867m  14m S  0.0  5.4   0:10.82 java 67138 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.32 java 67139 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.32 java 67140 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.31 java 67141 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.35 java 67142 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.35 java 67143 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.36 java 67144 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.33 java 67145 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.31 java 67146 root      20   0 6825m 867m  14m S  0.0  5.4   0:08.29 java 67147 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.02 java 67148 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.35 java 67149 root      20   0 6825m 867m  14m S  0.0  5.4   0:00.00 java 67150 root      20   0 6825m 867m  14m S  0.0  5.4   0:25.08 java

jstack使用

jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:

1
jstack [option] pid

参数如下:

  1. -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
  2. -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
123456789101112131415161718192021222324252627
[[email protected] board-api]# jstack -l 67136 | moreFull thread dump Java HotSpot(TM) 64-Bit Server VM (25.161-b12 mixed mode):

"Thread-12126" #12389 daemon prio=6 os_prio=0 tid=0x00007f3190075800 nid=0x15d08 runnable [0x00007f31f43c4000]   java.lang.Thread.State: RUNNABLE	at java.net.SocketInputStream.socketRead0(Native Method)	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)	at java.net.SocketInputStream.read(SocketInputStream.java:171)	at java.net.SocketInputStream.read(SocketInputStream.java:141)	at java.io.BufferedInputStream.read1(BufferedInputStream.java:284)	at java.io.BufferedInputStream.read(BufferedInputStream.java:345)	- locked <0x00000000f49e3158> (a java.io.BufferedInputStream)	at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)	at java.io.BufferedInputStream.read(BufferedInputStream.java:265)	- locked <0x00000000f49e51a8> (a org.apache.commons.net.telnet.TelnetInputStream)	at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:132)	at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:603)	at java.lang.Thread.run(Thread.java:748)

Locked ownable synchronizers:	- None

"Thread-12125" #12388 daemon prio=6 os_prio=0 tid=0x00007f31c4602000 nid=0x15cf2 runnable [0x00007f31f4bcc000]   java.lang.Thread.State: RUNNABLE	at java.net.SocketInputStream.socketRead0(Native Method)	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)	at java.net.SocketInputStream.read(SocketInputStream.java:171)

使用printf "%x\n",获得线程ID=的十六进制值。

12
[[email protected] board-api]# printf "%x\n" 671631065b

查看该线程的堆栈:

123456789101112131415161718192021
[[email protected] board-api]# jstack -l 67136 | grep 1065b -A20"System Clock" #17 daemon prio=5 os_prio=0 tid=0x00007f322d089000 nid=0x1065b runnable [0x00007f320487c000]   java.lang.Thread.State: TIMED_WAITING (parking)	at sun.misc.Unsafe.park(Native Method)	- parking to wait for  <0x00000000c19c8d18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)	at java.lang.Thread.run(Thread.java:748)

Locked ownable synchronizers:	- None

"Druid-ConnectionPool-Destroy-1390913202" #16 daemon prio=5 os_prio=0 tid=0x00007f322ea27800 nid=0x1065a waiting on condition [0x00007f320497d000]   java.lang.Thread.State: TIMED_WAITING (sleeping)	at java.lang.Thread.sleep(Native Method)	at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2538)

原文地址:https://www.cnblogs.com/huanglog/p/10270660.html

时间: 2024-08-28 21:29:40

JVM性能分析工具jstack介绍的相关文章

jvm性能分析工具使用

jvm性能分析 一.JPS:列出本机所有java进程的pid 命令选项 -q 仅输出VM标识符,不包括class name,jar name,arguments in main method -m 输出main method的参数 -l 输出完全的包名,应用主类名,jar的完全路径名 -v 输出jvm参数 -V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 -Joption 传递参数到vm,例如:-J-Xms48m 二.jmap:性能调优工

Oracle性能分析工具介绍及使用

oracle数据库级别优化分析工具介绍 当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类 一类是数据库级别的统计信息二类是os级别的统计信息 下面就分别介绍在不同的级别下,常用什么工具来收集信息帮助优化诊断 首先是oracle数据库级别优化分析工具介绍 目录: 1.statspack2.ASH3.AWR4.ORACLE EXPLAIN PLAN的总结(查询sql的执行计划)   a.autotrace   b.explain的使用 1.stats

Android性能分析工具介绍

1. Android系统性能调优工具介绍 http://blog.csdn.net/innost/article/details/9008691 TraceviewSystraceOprofile 2. [腾讯开源]Android性能测试工具APT使用指南 http://www.csdn.net/article/2014-04-23/2819366-tencent-APT-open-source-tool-guide APT源码地址:https://code.csdn.net/Tencent/a

系统级性能分析工具perf的介绍与使用

测试环境:Ubuntu14.04  on VMWare Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化.性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码.代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能. 在性能剖析阶段,需要借助于现有的profiling工具,如perf等.在代码优化阶段往往需要借助开发者的经验,编写简洁高效的代码,甚至在汇编级别合理使用各种指令,合理安排各种指

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具.它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的.在第2章,我强调了基于数据驱动的性能测试是非常重要的,我们必须测试应用的性能并理解每个指标的含义.性能分析和数据驱动非常类似,为了提升应用程序的性能,我们必须获取应用运行的相关数据.如何获取这些数据并理解它们是本章的主题.[本章重点介绍JDK中提供的性能分析工具] 操作系统工具及其分析 程序分析的起点并不

Java 性能分析工具 , 第 2 部分:Java 内置监控工具

引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工具,其中包括: jcmd:打印一个 Java 进程的类,线程以及虚拟机信息.适合用在脚本中.使用 jcmd - h 来查看使用方法. jconsole:提供 JVM 活动的图形化展示,包括线程使用,类使用以及垃圾回收(GC)信息. jhat:帮助分析内存堆存储. jmap:提供 JVM 内存使用信息

UAVStack JVM监控分析工具:图形化展示采集及分析监控数据

引言 作为AllInOne的智能化服务技术栈,UAVStack提供了非常全面的监控数据采样功能,同时支持数据监控与预警.近期,我们整合了原有的数据采集展示功能,新增JVM分析功能,推出了更易用的JVM监控分析工具. 熟悉JDK的开发者都知道,JDK本身提供了一套JVM分析工具,包括jinfo.jmap.jstack等.用户可以通过命令行轻松获取JVM内存堆栈信息.内存对象分配以及JVM启动基本参数信息.但这些工具需要在命令行环境中执行,且生产环境下则需要通过堡垒机转发. 开源社区一些不错的JVM

Java 性能分析工具

如何利用 JConsole观察分析Java程序的运行,进行排错调优 http://jiajun.iteye.com/blog/810150 如何使用JVisualVM进行性能分析 http://jiajun.iteye.com/blog/1180230 全功能的Java剖析工具(profiler) http://www.blogjava.net/mrzhangshunli/archive/2007/08/27/140088.html http://www.cnblogs.com/jayzee/p

Windows系统内存分析工具的介绍

? Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管理器(Task Manager), 资源监视器(Resource Manager), 性能监视器(Performance Monitor), 还有SysInternals工具, ?RamMap, PoolMon用以分析内存问题.本文简单介绍上述工具的快速使用方法,如果需要了解深入了解,请参考微软