Java自带命令详解
1. 背景
给一个系统定位问题的时候,知识、经验是关键基础,数据(运行日志、异常堆栈、GC日志、线程快照[threaddump / javacore文件]、堆转储快照[heapdump / hprof])是依据,工具是运用知识处理数据的手段。
经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。
2. jps
jps(JVM Process Status Tool)可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(Process Identifier, PID)是一致的。
2.1 用法
主要选项
| 选项 | 作用 | 备注 |
| -q | 只输出LVMID,省略主类的名称 | |
| -m | 输出虚拟机进程启动时传递给主类main()函数的参数 | |
| -l | 输出主类的全名,如果进程执行的是jar包,输出jar路径 | |
| -v | 输出虚拟机进程启动时JVM参数 |

3. jstat
3.1 用法
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。
它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jstat [option vmid [interval][s|ms] [count]]
option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况。具体如下表:

| 选项 | 作用 |
| -class |
监视类装载、卸载数量、总空间以及类装载所耗费的时间。
Loaded:加载class的数量; Bytes:所占用空间大小; Unloaded:未加载数量; Bytes:未加载占用空间; Time:加载耗时。 |
| -gc |
监视Java堆状况,包括Eden区、两个Survivor区、老年区、元数据等的容量、已用空间,GC时间合计等信息。
S0C,S1C,EC,OC,MC,CCSC:S0,S1,Eden,老年代,Metaspace和压缩类空间大小; S0U,S1U,EU,OU,MU,CCSU:S0,S1,Eden,老年代,Metaspace和压缩类空间已经使用的大小; YGC,YGCT,FGC,FGCT:Young GC和Full GC的次数和耗时; GCT:垃圾回收的耗时。 |
| -gccapacity |
监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
NGCMN,NGCMX,NGC:新生代最小、最大和当前容量; S0C,S1C,EC:s0,s1,eden区大小; OGCMN,OGCMX,OGC:老年代最小、最大和当前容量; OC:老年代当前容量; MCMN,MCMX,MC:元数据最小、最大和当前容量; CCSMN,CCSMX,CCSC:压缩类空间的最小、最大和当前容量; YGC,FGC:minor GC和full GC的次数。 |
| -gcutil |
监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
S0,S1(标示Survivor0,Survivor1):使用了0%; E(新生代Eden区):使用了5.78%; O(老年代):使用了16.92%; M(元空间Metaspace):使用了91.97%; CCS:压缩使用81.54%; YGC(标示Young GC),YGCT:程序运行以来共发生Minor GC651次,总耗时4.446秒; FGC(标示Full GC),FGCT:Full GC640次,总耗时86.409秒; GCT(GC Time):所有GC耗时为90.855。 |
| -gccause |
与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因。
|
| -gcnew |
监视新生代GC状况。
S0C,S1C,S0U,S1U,EC,EU,YGC,YGCT同上; TT:对象在新生代存活的次数; MTT:对象在新生代存活的最大次数; |
| -gcnewcapacity |
监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间。
同上 |
| -gcold |
监视老年代GC状况。
|
| -gcoldcapacity |
监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间。
|
| -gcmetacapacity |
输出元数据(Metaspace)使用到的最大、最小空间。
|
| -compiler |
输出JIT编译器编译过的方法、耗时等信息。
Compiled:编译方法数量; Failed:失败数量; Invalid:不可用数量; Time:编译耗时; FailedType:失败类型; FailedMethod:失败的方法。 |
| -printcompilation |
输出已经被JIT编译的方法。
Compiled:最近编译方法的数量; Size:最近编译方法的字节码数量; Type:最近编译方法的编译类型; Method:方法名标识。 |
如果是本地虚拟机进程,则VMID与LVMID是一致的,如果是远程虚拟机进程,那么VMID的格式是:
[protocal:][//]vmid[@hostname[:port]/servername]
interval代表查询间隔
count代表查询次数
如果省略这两个参数,说明只查询一次。
4. jinfo(即将废弃)
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。
使用jps -v命令可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值。
可以使用jinfo的-flag选项进行查询
4.2 用法
jinfo [option] pid
5. jmap
jmap(Memory Map for Java,Java内存映像工具):命令用于生成堆转储快照(heapdump或dump文件)。
-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,
通过-XX:+HeapDumpOnCtrlBreak参数则可以使用Ctrl + Break组合键让虚拟机生成dump文件。
jmap还可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率,当前用的是哪种收集器等。
说明:除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux / Solaris使用。
5. 2 用法
jmap [option] vmid
option选项的合法值与具体含义如下表:
| 选项 | 作用 |
| -dump |
生成Java堆转储快照,格式为:-dump[live, ]format=b, file=<filename>,其中live子参数说明是否只dump出存活的对象。 如: jmap -dump:format=b,file=dump.bin 3500 |
| -finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效。 |
| -heap | 显示Java堆详细信息,如使用哪种回收器,参数配置,分代状况等。只在Linux/Solaris平台下有效。 |
| -histo | 显示堆中对象统计信息,包括类,实例数量,合计容量。 |
| -permstat | 以ClassLoader为统计口径显示永久代内存状况,只在Linux/Solaris平台有效。 |
| -F | 当虚拟机进程堆-dump选项没有响应时,可使用这个选项强制生成dump快照。只在Linux/Solaris平台有效。 |
注意:更为详细的使用可以参考:Java内存分析工具jmap
6. jhat
jhat虚拟机堆转储快照分析工具,用来分析jmap生成的堆转储快照。
jhat内置了一个微型的HTTP/HTML服务器 ,生成dump文件的分析结果后,可以在浏览器中查看。
一般不会直接使用jhat,而是采用更加专业的VisualVM,Eclipse Memory Analyzer,IBM HeapAnalyzer等。
6.1 用法
jhat dump.bin
7. jstack
jstack(Stack Trace for Java):用来生成虚拟机当前时刻的线程快照(称为threaddump或javacore文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底是后台做什么请求,或等待什么资源。
7.1 用法
jstack [option] vmid
option选项的合法值如下表:
| 选项 | 作用 |
| -F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
| -l | 除堆栈外,显示关于锁的附加信息 |
| -m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
8. javap
javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
8.2 用法
语法:
javap [ 命令选项 ] class. . .
javap命令用于解析类文件。其输出取决于所用的命令选项。若没有使用命令选项,javap将输出传递给它的类的public 域及方法。javap将其输出到标准输出设备上。
命令选项:
-help 输出 javap 的帮助信息。
-l 输出行及局部变量表。
-b 确保与 JDK 1.1 javap 的向后兼容性。
-public 只显示 public 类及成员。
-protected 只显示 protected 和 public 类及成员。
-package 只显示包、protected 和 public 类及成员。这是缺省设置。
-private 显示所有类和成员。
-J[flag] 直接将 flag 传给运行时系统。
-s 输出内部类型签名。
-c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
-verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
-classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
-bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelib下面。
-extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
8.3 实例
package com.huawei.thread;
public class Test44 {
public static volatile int race = 0;
public static void increase() {
race++;
}
private static final int THREADS_COUNT = 20;
public static void main(String[] args) {
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
increase();
}
}
});
threads[i].start();
}
while (Thread.activeCount() > 1) {
Thread.yield();
}
System.out.println(race);
}
}
javap -c Test44生成的字节码为:
D:\workspace\Thread\bin\com\huawei\thread>javap -c Test44
警告: 二进制文件Test44包含com.huawei.thread.Test44
Compiled from "Test44.java"
public class com.huawei.thread.Test44 {
public static volatile int race; static {};
Code:
0: iconst_0
1: putstatic #13 // Field race:I
4: return public com.huawei.thread.Test44();
Code:
0: aload_0
1: invokespecial #18 // Method java/lang/Object."<init>":()V
4: return public static void increase();
Code:
0: getstatic #13 // Field race:I
3: iconst_1
4: iadd
5: putstatic #13 // Field race:I
8: return public static void main(java.lang.String[]);
Code:
0: bipush 20
2: anewarray #25 // class java/lang/Thread
5: astore_1
6: iconst_0
7: istore_2
8: goto 37
11: aload_1
12: iload_2
13: new #25 // class java/lang/Thread
16: dup
17: new #27 // class com/huawei/thread/Test44$1
20: dup
21: invokespecial #29 // Method com/huawei/thread/Test44$1."<init>":()V
24: invokespecial #30 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
27: aastore
28: aload_1
29: iload_2
30: aaload
31: invokevirtual #33 // Method java/lang/Thread.start:()V
34: iinc 2, 1
37: iload_2
38: bipush 20
40: if_icmplt 11
43: goto 49
46: invokestatic #36 // Method java/lang/Thread.yield:()V
49: invokestatic #39 // Method java/lang/Thread.activeCount:()I
52: iconst_1
53: if_icmpgt 46
56: getstatic #43 // Field java/lang/System.out:Ljava/io/PrintStream;
59: getstatic #13 // Field race:I
62: invokevirtual #49 // Method java/io/PrintStream.println:(I)V
65: return
Java自带命令详解的更多相关文章
- java之jar命令详解
1. JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.JAR 文件非常类似 ZIP 文件——准确的说, ...
- Java中jar命令详解
做项目的时候我们肯定接触过很多jar包,那么jar包是什么呢?笔者了解到jar是java archive file 的简写.从名字就可以知道,它的应用与Java息息相关.下面就详细介绍如何自己生成ja ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...
- [转] - JAR文件包及jar命令详解 ( MANIFEST.MF的用法 )
常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. chm 文档一样双击运行了:而另一种是使用 JET 来进 ...
- javac命令详解(上)
摘自http://blog.csdn.net/hudashi/article/details/7058998 javac命令详解(上) ja ...
- db2常用命令(详解)大全
近一年来在项目开发中使用到了IBM的DB2 9.1的数据库产品,跟Oracle相比一些命令有很大的区别,而它最大的功能是支持 xml存储.检索机制,通过XPath进行解析操作,使开发人员免于 ...
- java ssl https 连接详解 生成证书 tomcat keystone
java ssl https 连接详解 生成证书 我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over ...
- jvm 性能调优工具之 jps 命令详解
JPS名称:jps - Java Virtual Machine Process Status Tool命令用法:jps [options] [hostid] options:命令选项,用来对输出格式 ...
随机推荐
- FIS常用功能之资源压缩
fis server start后 资源压缩,只需要使用命令,不需要添加任何配置 fis release --optimize 或: fis release -o 在浏览器访问按F12,观看压缩前后文 ...
- 基于Python的交互式访问
应用迁移中遇到一些有特殊要求的应用,比如需要通过交互生成一些新的config文件,然后启动应用需要依赖于这些文件,这样在构建镜像的时候基本上是没有办法把这些文件固定的,因为他需要根据运行环境去进行动态 ...
- PLSQL Developer连接远程Oracle方法(非安装client)
远程连接Oracle比較麻烦,通常须要安装oracle的客户端才干实现. 通过instantclient能够比較简单的连接远程的Oracle. 1.新建文件夹D:\Oracle_Cleint用于存放相 ...
- js 在表单提交前进行操作
最近在写页面的时候,需要手动写一些在表单进行提交前的验证操作,正好看到了2种阻止表单提交的方法,可以进行一些逻辑处理 方法一:使用return false 原生js写法: <form id=&q ...
- JS-产生随机数的几个用法!
<script> function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.random(); ret ...
- 【笔记】关于require.js 的用法
最近忙于学校的一个新网站建设,对于以前的前端程序编写方式的不正规特意上网学习了require.js 的用法,使此次的工程更加有条理同时符合当前前端的开发模式——前端模块化. 网上有不少很好的学习文章这 ...
- 【笔记】探索js 的this 对象 (第一部分)
最近在看 你不知道的javascript 这本书,在第二部分看到了一个比较重要的知识点 那就是 this对象的全面认识,于是做一下笔记 博主本人在看这本书之前也一直以为 this 是指一切引用类型的本 ...
- 不输入sudo使用docker
系统是debian系 安装: sudo apt install docker.io 将当前用户加入‘docker’组: sudo gpasswd -a ${USER} docker 刷新权限: su ...
- sdut 3-7 类的友元函数的应用
3-7 类的友元函数的应用 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握类的友元函数的定义和使用方法 要求设计一个点类Poin ...
- 求字符串A与字符串B的最长公共字符串(JAVA)
思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...











