JDK的命令行工具系列 (一) jps、jstat
概述
在我们进行故障定位和性能分析时, 可以使用Java Dump(也叫Dump文件)来帮助排查问题, 它记录了JVM运行期间的内存占用和线程执行等情况。其中Heap Dump文件是二进制格式, 它保存了某一时刻的系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等, 是指定时刻的java堆栈的快照; Thread Dump文件是纯文本格式, 它保存了java应用程序各线程在某一时刻的运行位置。
在%JAVA_HOME%\lib目录下, 有一些诸如jps.exe、jstack.exe、jmap.exe的命令行工具, 它们主要是用来监视虚拟机和故障处理的。
名称 | 主要作用 |
jps | 显示当前系统的java进程和id号 |
jstat | 监视虚拟机各种运行状态信息, 如进程中的类装载、内存、垃圾收集、JIT编译等运行参数 |
jinfo | 实时查看和调整虚拟机各项参数 |
jmap | 生成虚拟机的内存转储快照(heap dump文件) |
jhat | 用于分析heap dump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 |
jstack | 生成虚拟机指定时刻的线程快照(thread dump文件) |
jps: 虚拟机进程状况工具
我们先自己编写一个类:
import java.util.Arrays; public class JpsDemo {
public static void main(String[] args) {
while(true){
System.out.println(Arrays.toString(args));
System.out.println(1);
}
}
}
dos命令行下, 使用javac命令编译、java命令运行, 并给main()方法传递参数 88 66。
jps -help 帮助指令
jps -q 只显示pid, 不显示class名称、jar名称和和传递给main 方法的参数
jps -m 显示pid, class名称和传递给main 方法的参数
jps -l 显示应用程序主类的完整package名 或者 应用程序的jar文件完整路径名
jps -v 显示传递给JVM的参数
jps、jstack这些指令都是基于一个实现机制: java应用程序在启动时, 会在java.io.tmpdir指定的目录下, 生成一个类似于hsperfdata_{username}的文件夹, 在这个文件夹下会有几个文件, 文件名就是java进程的pid, JVM运行的一些参数都可以通过解析这几个文件获得。例如在上面的JpsDemo类启动后, 在我自己电脑上生成的临时文件夹位置: C:\Users\liqingshan\AppData\Local\Temp\hsperfdata_qingshan, 如下所示, 文件名称 5144 对应JpsDemo这个进程的pid。
jps失效处理
由此我们得出, 上述所有操作都是基于/hsperfdata_{username}/pid文件来进行的。所以如当前用户没有权限写hsperfdata_{username}目录或磁盘已满时、或在linux环境下/tmp临时文件夹被定时任务清理掉, 都会导致无法创建/hsperfdata_{username}/pid文件, 这样就造成了jps、jstack、jmap这些类似的命令出现失效的情况。具体的失效细节在本篇不做多解释, 读者可自行参考Java命令学习系列(一)中的jps失效处理小节。
jstat: 虚拟机统计信息监视工具
jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。
jstat命令格式: jstat [option vmid [interval [s|ms] [count] ] ], 下面是参数描述:
- vmid —虚拟机进程的pid。如果是本地虚拟机进程, 则vmid和lvmid(即本地虚拟机进程pid)是一致的; 如果是远程虚拟机进程, 则vmid的格式是: [protocol:] [//] lvmid [@hostname[:port]/servername]
- interval —查询间隔, 单位为秒或毫秒
- count —查询次数
如果同时省略interval和count, 表明只查询一次。假设需要每500毫秒查询一次进程16744垃圾收集状况,一共查询10次,则命令行应输入:jstat -gc 16744 500 10
选项option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下表:
选项 | 作用 |
-class | 监视类装载、卸载数量、总空间及类装载所耗费的时间 |
-gc | 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量 |
-gccapacity | 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcnew | 监视新生代GC的状况 |
-gcnewcapacity | 监视内容与-gcnew基本相同,但输出主要关注使用到的最大和最小空间 |
-gcold | 监视老年代GC的状况 |
-gcoldcapacity | 监视内容与-gcold基本相同,输出主要关注使用到的最大和最小空间 |
–gcpermcapacity | 输出永久代使用到的最大和最小空间 |
-compiler | 输出JIT编译器编译过的方法、耗时等信息 |
-printcompilation | 输出已经被JIT编译的方法 |
下面我们就对表格中的一些选项参数做个演示, 先别忘了随便编写个java程序跑起来, 然后输入jstat命令(使用的运行环境是 JDK 1.8):
-class (监视类装载、卸载数量、总空间以及耗费的时间)
C:\Users\liqingshan>jstat -class 16744
Loaded Bytes Unloaded Bytes Time
430 880.6 0 0.0 0.05
- Loaded : 装载的类的数量
- Bytes : 装载类所占用的字节数
- Unloaded : 卸载类的数量
- Bytes : 卸载类的字节数
- Time : 装载和卸载类所花费的时间
-compiler(输出JIT编译过的方法数量耗时等)
C:\Users\liqingshan>jstat -compiler 16744
Compiled Failed Invalid Time FailedType FailedMethod
107 0 0 0.12 0
- Compiled : 编译任务执行数量
- Failed : 编译任务执行失败数量
- Invalid : 编译任务执行失效数量
- Time : 编译任务消耗时间
- FailedType : 最后一个编译失败任务的类型
- FailedMethod : 最后一个编译失败任务所在的类及方法
-gc(垃圾回收堆的行为统计,常用命令)
C:\Users\liqingshan>jstat -gc 16744
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 0.0 64.0 24064.0 18288.8 87552.0 764.1 4864.0 2709.6 512.0 294.8 711 0.234 0 0.000 0.234
- S0C : 新生代中第一个survivor的容量 (字节)
- S1C : 新生代中第二个survivor的容量 (字节)
- S0U : 新生代中第一个survivor目前已使用空间 (字节)
- S1C : 新生代中第二个survivor目前已使用空间 (字节)
- EC : 新生代中Eden的容量 (字节)
- EU : 新生代中Eden目前已使用空间 (字节)
- OC : Old代的容量 (字节)
- OU : Old代目前已使用空间 (字节)
- MC : 方法区大小
- MU : 方法区使用大小
- CCSC : 压缩类空间大小
- CCSU : 压缩类空间使用大小
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时
-gccapacity (同-gc,还会输出Java堆各区域使用到的最大、最小空间)
C:\Users\liqingshan>jstat -gccapacity 16744
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
43520.0 689152.0 30720.0 512.0 512.0 24064.0 87552.0 1379328.0 87552.0 87552.0 0.0 1056768.0 4864.0 0.0 1048576.0 512.0 884 0
- NGCMN :新生代最小容量
- NGCMX :新生代最大容量
- NGC :当前新生代容量
- S0C :第一个幸存区大小
- S1C :第二个幸存区的大小
- EC :伊甸园区的大小
- OGCMN :老年代最小容量
- OGCMX :老年代最大容量
- OGC :当前老年代大小
- OC : 当前老年代大小
- MCMN : 最小元数据容量
- MCMX :最大元数据容量
- MC :当前元数据空间大小
- CCSMN :最小压缩类空间大小
- CCSMX :最大压缩类空间大小
- CCSC :当前压缩类空间大小
- YGC :年轻代gc次数
- FGC :老年代GC次数
-gcnew(统计新生代行为)
C:\Users\liqingshan>jstat -gcnew 16744
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
512.0 512.0 0.0 64.0 1 15 512.0 24064.0 5294.2 947 0.279
- S0C :第一个幸存区大小
- S1C :第二个幸存区的大小
- S0U :第一个幸存区的使用大小
- S1U :第二个幸存区的使用大小
- TT : 对象在新生代存活的次数
- MTT : 对象在新生代存活的最大次数
- DSS : 期望的幸存区大小
- EC :伊甸园区的大小
- EU :伊甸园区的使用大小
- YGC :年轻代垃圾回收次数
- YGCT :年轻代垃圾回收消耗时间
-gcnewcapacity(新生代与其相应的内存空间的统计)
C:\Users\liqingshan>jstat -gcnewcapacity 16744
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
43520.0 689152.0 30720.0 229376.0 512.0 229376.0 512.0 688128.0 24064.0 1054 0
- NGCMN :新生代最小容量
- NGCMX :新生代最大容量
- NGC :当前新生代容量
- S0CMX :最大幸存1区大小
- S0C :当前幸存1区大小
- S1CMX :最大幸存2区大小
- S1C :当前幸存2区大小
- ECMX :最大伊甸园区大小
- EC :当前伊甸园区大小
- YGC :年轻代垃圾回收次数
- FGC :老年代回收次数
-gcold(统计老年代行为)
C:\Users\liqingshan>jstat -gcold 16744
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
4864.0 2709.6 512.0 294.8 87552.0 764.1 1097 0 0.000 0.309
- MC :方法区大小
- MU :方法区使用大小
- CCSC : 压缩类空间大小
- CCSU : 压缩类空间使用大小
- OC :老年代大小
- OU :老年代使用大小
- YGC :年轻代垃圾回收次数
- FGC :老年代垃圾回收次数
- FGCT :老年代垃圾回收消耗时间
- GCT :垃圾回收消耗总时间
-gcoldcapacity(老年代与其相应的内存空间的统计)
C:\Users\liqingshan>jstat -gcoldcapacity 16744
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
87552.0 1379328.0 87552.0 87552.0 1120 0 0.000 0.313
- OGCMN :老年代最小容量
- OGCMX :老年代最大容量
- OGC :当前老年代大小
- OC :老年代大小
- YGC :年轻代垃圾回收次数
- FGC :老年代垃圾回收次数
- FGCT :老年代垃圾回收消耗时间
- GCT :垃圾回收消耗总时间
-gcmetacapacity (元数据空间统计, 在jdk之前对应永久代区域)
C:\Users\liqingshan>jstat -gcmetacapacity 16744
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1056768.0 4864.0 0.0 1048576.0 512.0 1170 0 0.000 0.322
- MCMN : 最小元数据容量
- MCMX :最大元数据容量
- MC :当前元数据空间大小
- CCSMN :最小压缩类空间大小
- CCSMX :最大压缩类空间大小
- CCSC :当前压缩类空间大小
- YGC :年轻代垃圾回收次数
- FGC :老年代垃圾回收次数
- FGCT :老年代垃圾回收消耗时间
- GCT :垃圾回收消耗总时间
-gcutil(同-gc,输出的是已使用空间占总空间的百分比)
C:\Users\liqingshan>jstat -gcutil 16744
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 6.25 62.00 0.87 55.71 57.57 1189 0.326 0 0.000 0.326
- S0 :幸存1区当前使用比例
- S1 :幸存2区当前使用比例
- E :伊甸园区使用比例
- O :老年代使用比例
- M :元数据区使用比例
- CCS :压缩使用比例
- YGC :新生代垃圾回收次数
- YGCT : 新生代垃圾回收消耗时间
- FGC :老年代垃圾回收次数
- FGCT :老年代垃圾回收消耗时间
- GCT :垃圾回收消耗总时间
-printcompilation(hotspot编译方法统计)
C:\Users\liqingshan>jstat -printcompilation 16744
Compiled Size Type Method
107 382 1 JpsDemo main
- Compiled :被编译方法的数量
- Size :被编译方法字节码的字节数
- Type :编译类型
- Method :编译方法的类名和方法名
参考资料
java程序性能分析之thread dump和heap dump
Java命令学习系列(零)——常见命令及Java Dump介绍-HollisChuang's Blo...
Java命令学习系列(一)——Jps-HollisChuang's Blog
Java命令学习系列(四)——jstat-HollisChuang's Blog
作者:张小凡
出处:https://www.cnblogs.com/qingshanli/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】。
JDK的命令行工具系列 (一) jps、jstat的更多相关文章
- JDK的命令行工具系列 (三) jhat、jstack
jhat: heapdump文件分析工具 在前两篇系列文章JDK的命令行工具系列 (一) jps.jstat.JDK的命令行工具系列 (二) javap.jinfo.jmap中, 我们已经介绍过了jp ...
- JDK的命令行工具系列 (二) javap、jinfo、jmap
javap: 反编译工具, 可用来查看java编译器生成的字节码 参数摘要: -help 帮助 -l 输出行和变量的表 -public 只输出public方法和域 -protected 只输出publ ...
- JDK的命令行工具
Jcmd:综合工具 jcmd -l 列出当前运行的所有虚拟机 参数-l表示列出所有java虚拟机,针对每一个虚拟机,可以使用help命令列出该虚拟机支持的所有命令 jcmd [pid] help j ...
- 虚拟机性能监控与故障处理工具------JDK的命令行工具
①jps:虚拟机进程状况工具 功能:列出正在运行的虚拟机进程,并显示1.虚拟机执行主类名称以及2.这些进程的本地虚拟机唯一ID(LVMID). 使用频率最高的JDK命令行工具,其他的JDK工具大多需要 ...
- jdk命令行工具系列
虚拟机堆转储快照分析工具使用jmap等方法生成java的堆文件后jhat:虚拟机堆转储快照分析工具 导出程序执行的堆信息 jps jps -l jmap -dump:format=b,file=D:/ ...
- JDK常用命令行工具(基于JDK10)
虽然我是在jdk10环境下, 但是大体上和jdk8是差不多的. 总共有这么多 本来想着一口气把所有命令都边学边总结一下的, 结果发现....有些还真的不是很常用....或者说我这个水平还接触不到那么多 ...
- JDK常用命令行工具使用
- JVM性能监控工具(一)-jdk命令行工具
转载:http://blog.csdn.net/top_code/article/details/51456186 当系统出bug需要定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处 ...
- JVM性能监控与故障处理命令行工具
JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...
随机推荐
- 【JAVA8】Set排序四种写法
工作中遇到,写了很久以前的写法,师兄给了很多建议,于是整理了一下.孔子曰:"你知道茴香豆的茴字有几种写法吗?" 第一种,平常的写法: public class App { publ ...
- JS中的闭包 详细解析大全(面试避必考题)
JS中闭包的介绍 闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变 ...
- Linux 中文件和文件夹获取 MySQL 权限(SELinux)
今天在 Linux 系统上移动 MySQL 的数据库目录 配置如下: /etc/my.cnf [mysqld]datadir=/home/mysqlsocket=/var/lib/mysql/mysq ...
- 利用jsonconvert来转换json数据格式 (对象转为json)
今天学了一下.net的WCF组件,边心血来潮,想着现在不都是前后分离,调接口开发不,于是赶紧写了一简单的后台数据,哈哈 废话不多说,直接上代码: 注意需要导入库! 实体类:Customer us ...
- python的数据类型之字符串(二)
字符串常见操作 如有字符串mystr = 'hello xiaose',以下是常见的操作 1.find 检测某个字符串是否包含在 mystr中,如果是返回开始的索引值,否则返回-1 格式:mystr. ...
- CentOS Linux 重启详解
一.Linux 的五个重启命令 1.shutdown 2.poweroff 3.init 4.reboot 5.halt 二.五个重启命令的具体说明 shutdown reboot 在linux下一些 ...
- Azkaban 3.73.1 使用简介
本文上接<Azkaban 3.73.1 集群搭建(Multiple Executor)>,对Azkaban的使用做简单说明 目录 目录 简介 1. 登录 2. 创建工程 3. 创建job ...
- redis module 学习—官网文档整理
前言 redis在4.0版本中,推出了一个非常吸引的特性,可以通过编写插件的模式,来动态扩展redis的能力.在4.0之前,如果用户想拥有一个带TTL的INCRBY 命令,那么用户只能自己去改代码,重 ...
- 爬取链家网租房图 使用ImagesPipeline保存图片
# 爬虫文件 # -*- coding: utf-8 -*- import scrapy import os from urllib import request from lianjia.items ...
- 西门子PLC中各个组织块OB作用(OB1、OB100……)
1.自由循环组织块OB1 S7 CPU启动完成后,操作系统循环执行OB1,OB1执行完成后,操作系统再次启动OB1.在OB1中可以调用FB.SFB.FC.SFC等用户程序使其循环执行.除OB90以外 ...