JAVA程序分析工具jstat和jstack

jstat

Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
jstat -options?可以列出当前JVM版本支持的选项。

top

这里主要查进程相关线程的资源使用情况。

jstack

Java Virtual Machine Stack Trace for Java 显示虚拟机的线程快照
jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如请求外部资源导致的长时间等待、线程间死锁、死循环等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

1、使用jstat -gc显示gc的信息,查看gc的次数,及时间

[root@VM_101_10_centos output]# /usr/local/jdk/bin/jstat -gc 15834 250 20
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402518.7  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402518.7  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402826.0  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402826.0  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 403040.3  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 404001.7  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 404322.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843

2、使用jstat -gcutil统计gc信息

[root@VM_101_10_centos output]# /usr/local/jdk/bin/jstat -gcutil 15834
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 32.05   0.00  20.83  14.53  97.79  96.30     28    0.730     4    0.124    0.854

3、使用top -Hp显示进程所有的线程信息查找CPU耗时最长线程PID

[root@VM_101_10_centos output]# top -Hp 15834
top - 11:21:25 up 31 days, 16:20,  3 users,  load average: 0.02, 0.02, 0.05
Threads:  96 total,   0 running,  96 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010308 total,   399352 free,  4824492 used,  2786464 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2860188 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
15834 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java
15837 root      20   0 4783692 900036  19164 S  0.0 11.2   0:10.91 java
15838 root      20   0 4783692 900036  19164 S  0.0 11.2   0:02.02 java
15839 root      20   0 4783692 900036  19164 S  0.0 11.2   0:02.02 java
15840 root      20   0 4783692 900036  19164 S  0.0 11.2   0:01.99 java
15841 root      20   0 4783692 900036  19164 S  0.0 11.2   0:02.09 java
15842 root      20   0 4783692 900036  19164 S  0.0 11.2   0:03.29 java
15843 root      20   0 4783692 900036  19164 S  0.0 11.2   0:12.46 java
15844 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.03 java
15845 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.07 java
15846 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java
15847 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java
15848 root      20   0 4783692 900036  19164 S  0.0 11.2   0:57.35 java
15849 root      20   0 4783692 900036  19164 S  0.0 11.2   0:53.66 java
15850 root      20   0 4783692 900036  19164 S  0.0 11.2   0:08.55 java
15851 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.22 java
15852 root      20   0 4783692 900036  19164 S  0.0 11.2   1:05.21 java
15864 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.14 java
15885 root      20   0 4783692 900036  19164 S  0.0 11.2   0:26.94 java
15886 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java
15890 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java
15891 root      20   0 4783692 900036  19164 S  0.0 11.2   0:31.89 java
15893 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.08 java              

4、使用printf处理线程的16进制形式

[root@VM_101_10_centos output]#  printf "%x\n" 15852
3dec

5、使用jstack查找耗时进程是哪个函数

[root@VM_101_10_centos output]#  jstack 15834 |grep 3dec
"VM Periodic Task Thread" os_prio=0 tid=0x00007f0350135000 nid=0x3dec waiting on condition
[root@VM_101_10_centos output]#  jstack 15834 |grep 3de8
"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 tid=0x00007f0350105800 nid=0x3de8 waiting on condition [0x0000000000000000]
[root@VM_101_10_centos output]#  jstack 15834 |grep 3de9
"C2 CompilerThread1" #7 daemon prio=9 os_prio=0 tid=0x00007f0350108000 nid=0x3de9 waiting on condition [0x0000000000000000]

6、查找函数功能
"VM Periodic Task Thread"
该线程是JVM周期性任务调度的线程,它由WatcherThread创建,是一个单例对象。该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控。

"CompilerThread"
用来调用JITing,实时编译装卸CLASS。通常JVM会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,比如CompilerThread1。

原文地址:http://blog.51cto.com/jerrymin/2352786

时间: 2024-10-06 15:38:15

JAVA程序分析工具jstat和jstack的相关文章

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

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

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

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

[转帖]Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践

Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践 https://www.jianshu.com/p/d4e31301ba2e 一.问题描述 Linux服务器的配置是4核16G,将war包部署到tomcat后,启动tomcat,发现内存占用率不高,但是CPU一直高达100%:浏览器输入相关url也无法访问该项目,且tomcat的进程一直存在,程序的配置什么的都没问题啊,一头雾水......通过top命令查看服务器的性能状况如下: [[email prote

linux程序分析工具介绍(一)—-”/proc”

写在最前面:在开始本文之前,笔者认为先有必要介绍一下linux下的man,如果读者手头用linux系统,直接在终端输入man man便可以看到详细的说明,我在这里简单的总结一下,man命令是用来查看linux下各种命令.工具等的用户手册(manual)的.一种比较常用的用法是"man n field",这里的n是要查找的手册了类型,field是关键字.在这里介绍一下n: 0 /usr/include下的头文件 1 可执行程序和shell命令 2 系统调用 3 系统库函数 4 /dev下

linux程序分析工具介绍(三)——sar

本文要介绍的sar,是linux下用来分析系统本身运行情况的非常有用的工具.我们知道,程序在操作系统上要运行,要关注的点不外乎内存,CPU和IO(包括磁盘IO和网络IO).我们的应用程序在操作系统中运行前,我们需要了解系统当前的内存,cpu和IO的使用状况,还需要明白我们的应用程序运行时自身所需要的内存,cpu和IO资源的情况.只有操作系统剩余的内存,cpu和IO资源能够满足应用程序所需要的,才能保证应用程序在操作系统中正常的运行.sar就是用来帮助我们了解操作系统当前内存,cpu和IO等资源的

linux程序分析工具介绍(二)—-ldd,nm

本文要介绍的ldd和nm是linux下,两个用来分析程序很实用的工具.ldd是用来分析程序运行时需要依赖的动态库的工具:nm是用来查看指定程序中的符号表相关内容的工具.下面通过例子,分别来介绍一下这两个工具: 1. ldd, 先看下面的例子, 用ldd查看cs程序所依赖的动态库: [email protected]:~/Public$ ldd cs linux-gate.so.1 => (0xffffe000) libz.so.1 => /lib/libz.so.1 (0xb7f8c000)

Linux程序分析工具:ldd和nm

ldd和nm是Linux下两个非常实用的程序分析工具.其中,ldd是用来分析程序运行时需要依赖的动态链接库的工具,nm是用来查看指定程序中的符号表信息的工具. 1 ldd 格式:ldd [options] file    功能:列出file运行所需的共享库 参数: -d    执行重定位并报告所有丢失的函数 -r    执行对函数和对象的重定位并报告丢失的任何函数或对象 首先,ldd不是一个可执行程序,而是一个shell脚本.ldd能够显示可执行模块的dependency,其原理是通过设置一系列

JVM常用分析工具JPS/JINFO/JSTACK/JSTAT/JMAP详解

最近一直在上项目,导致博主天天加班幸福感爆棚,有木有. 平时一直没有关注过JVM,最近上了一个新的项目,它对内存的需求量比较大,导致目前项目在用的JVM参数不能满足他的需求.起初还没发现是这方面问题,后来在启动的时候报错了,一报错不要紧,要紧就要紧在博主我要调整JVM的参数了.调整参数也不要紧,更要紧的是调不对很让我着急. 因此,我就百谷了下,对JVM的相关内容突击了一下,受益匪浅啊. 废话不扯了,下面就是我的学习笔记啦.本篇博文就和大家分享下平时去分析JVM以及排故障时需要用到的几款工具. 目

jdk分析工具:jps和jstack

jps 用来查看:基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等. 与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. 使用jps时,不需要传递进程号做为参数. Jps也可以显示远程系统上的JAVA进程,这需要远程服务上开启了jstat服务,以及RMI注及服务,不过常用都是对本地的JAVA进程的查看. 命令格式 jps [ options ] [ hostid ] 常用参数说明 -m 输出传递给