JDK 常用内置命令

jps命令类似于Linux下的ps命令,用于列出当前正在运行的所有Java进程。

基本用法

直接运行不加任何参数就能列出所有java进程的pid和类的短名称。例如:

这里写图片描述

常用参数

-q参数

-q可以指定jps只列出pid,而不输出类的短名称,例如:

这里写图片描述

-m参数

-m参数可以用于列出传递给java进程主函数的参数,例如:

这里写图片描述
这里可以看到传递给jps(jps本身也是java进程)进程的参数就是-m

-l参数

-l参数用于输出主类的完整路径,例如:

这里写图片描述

-v参数

-v参数可以列出传递给java虚拟机的参数,例如:

这里写图片描述

概述

jstat是一个可以用于观察Java应用程序运行时相关信息的工具,功能非常强大,可以通过它查看堆信息的详细情况。

基本用法

jstat命令的基本使用语法如下:

jstat -option [-t] [-h] pid [interval] [count]

  • 选项option可以由以下值构成。 
    • -class:显示ClassLoader的相关信息。
    • -compiler:显示JIT编译的相关信息。
    • -gc:显示与gc相关的堆信息。
    • -gccapacity:显示各个代的容量及使用情况。
    • -gccause:显示垃圾回收的相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因。
    • -gcnew:显示新生代信息。
    • -gcnewcapacity:显示新生代大小与使用情况。
    • -gcold:显示老生代和永久代的信息。
    • -gcoldcapacity:显示老年代的大小。
    • -gcpermcapacity:显示永久代的大小。
    • -gcutil:显示垃圾收集信息。
    • -printcompilation:输出JIT编译的方法信息。
  • -t参数可以在输出信息前面加上一个Timestamp列,显示程序运行的时间。
  • -h参数可以在周期性的数据输出时,输出多少行数据后,跟着输出一个表头信息。
  • interval参数用于指定输出统计数据的周期,单位为毫秒(ms)。
  • count参数用于指定一共输出多少次数据。

详细使用

-class使用

下面命令输出pid为2500这个进程的ClassLoader相关信息,每秒统计一次信息,一共输出两次。 
这里写图片描述
Loaded表示载入的类的数量,第一个Bytes表示载入的类的合计大小,Unloaded表示卸载的类数量,第二个Bytes表示卸载的类的合计大小,Time表示加载和卸载类花的总的时间。

-compiler使用

下面的命令查看JIT编译的信息: 
这里写图片描述

Compiled表示编译任务执行的次数,Failed表示编译失败的次数,Invalid表示编译不可用的次数,Time表示编译的总耗时,FailedType表示最后一次编译的类型,FailedMethod表示最后一次编译失败的类名和方法名。

-gc使用

下面的命令显示与gc相关的堆信息的输出: 
这里写图片描述

  •          S0C:年轻代中第一个survivor(幸存区)的容量 (字节
             S1C:年轻代中第二个survivor(幸存区)的容量 (字节
             S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节
             S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节
             EC:年轻代中Eden(伊甸园)的容量 (字节
             EU:年轻代中Eden(伊甸园)目前已使用空间 (字节
             OCOld代的容量 (字节
             OUOld代目前已使用空间 (字节
             PCPerm(持久代)的容量 (字节
             PUPerm(持久代)目前已使用空间 (字节
             YGC:从应用程序启动到采样时年轻代中gc次数 
             YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 
             FGC:从应用程序启动到采样时old(gc)gc次数 
             FGCT:从应用程序启动到采样时old(gc)gc所用时间(s) 
             GCT:从应用程序启动到采样时gc用的总时间(s) 
             NGCMN:年轻代(young)中初始化(最小)的大小 (字节
             NGCMX:年轻代(young)的最大容量 (字节
             NGC:年轻代(young)中当前的容量 (字节
             OGCMNold代中初始化(最小)的大小 (字节
             OGCMXold代的最大容量 (字节
             OGCold代当前新生成的容量 (字节
             PGCMNperm代中初始化(最小)的大小 (字节
             PGCMXperm代的最大容量 (字节)   
             PGCperm代当前新生成的容量 (字节
             S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 
             S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 
             E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 
             Oold代已使用的占当前容量百分比 
             Pperm代已使用的占当前容量百分比 
             S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节
             S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节
             ECMX:年轻代中Eden(伊甸园)的最大容量 (字节
             DSS:当前需要survivor(幸存区)的容量 (字节)Eden区已满) 
             TT: 持有次数限制 
             MTT : 最大持有次数限制 

-gccapacity使用

下面的命令显示了各个代的信息,与-gc相比,它不仅输出了各个代的当前大小,还输出了各个代的最大值与最小值: 
这里写图片描述
* NGCMN:新生代最小值(KB) 
* NGCMX:新生代最大值(KB) 
* NGC:当前新生代大小(KB) 
* OGCMN:老年大最小值(KB) 
* OGCMX:老年代最大值(KB) 
* OGC:当前老年代大小(KB) 
* PGCMN:永久代最小值(KB) 
* PGCMX:永久代最大值(KB)

-gccause使用

下面命令显示最近一次gc的原因,以及当前gc的原因: 
这里写图片描述

  • LGCC:上次gc的原因,从图中可以看到上次gc的原因是Allocation Failure
  • GCC:当前gc的原因,图中当前没有gc

-gcnew使用

下面的命令显示新生代的详细信息: 
这里写图片描述
* TT:新生代对象晋升到老年代对象的年龄。 
* MTT:新生代对象晋升到老年代对象的年龄的最大值。 
* DSS:所需的Survivor区的大小。

-gcnewcapacity使用

下面的命令详细输出了新生代各个区的大小信息: 
这里写图片描述
* S0CMX:s0区的最大值(KB) 
* S1CMX:s1区的最大值(KB) 
* ECMX:eden区的最大值(KB)

-gcold使用

下面的命令显示老年代gc概况: 
这里写图片描述

-gcoldcapacity使用

下面的命令用于显示老年代的容量信息: 
这里写图片描述

-gcpermcapacity使用

下面的命令用于显示永久区的使用情况: 
这里写图片描述


jinfo可以用来查看正在运行的Java运用程序的扩展参数,甚至支持在运行时动态地更改部分参数,他的基本使用语法如下:

jinfo -< option > < pid >

其中option可以为以下信息: 
* -flag< name >: 打印指定java虚拟机的参数值。 
* -flag [+|-]< name >:设置或取消指定java虚拟机参数的布尔值。 
* -flag < name >=< value >:设置指定java虚拟机的参数的值。

使用示例

  1. 下面的命令显示了新生代对象晋升到老年代对象的最大年龄。在运行程序运行时并没有指定这个参数,但是通过jinfo,可以查看这个参数的当前的值。 
    这里写图片描述

  2. 下面的命令显示是否打印gc详细信息: 
    这里写图片描述

  3. 下面的命令在运用程序运行时动态打开打印详细gc信息开关: 
    这里写图片描述

注意事项

jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改。


jmap是一个多功能的命令。它可以生成Java程序的堆dump文件,也可以查看堆内对象实例的统计信息,查看ClassLoader的信息以及Finalizer队列。

使用示例

导出对象统计信息

下面的命令生成PID为2500的java成粗的对象的统计信息,并输出到out.txt文件中:

[qifuguang@winwill~]$ jmap -histo 2500 > out.txt
[qifuguang@winwill~]$
[qifuguang@winwill~]$
[qifuguang@winwill~]$
[qifuguang@winwill~]$
[qifuguang@winwill~]$
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

生成的文件如下: 
这里写图片描述
从文件中可以看到,统计信息显示了内存中实例的数量和合计。

导出程序堆快照

下面的命令导出PID为2500的java程序当前的堆快照:

[qifuguang@winwill~]$ jmap -dump:format=b,file=dump.bin 2500
Dumping heap to /home/qifuguang/dump.bin ...
Heap dump file created
  
  
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

该命令成功地将运用程序的当前的堆快照导出到了dump.bin文件,之后可以使用Visual VM,MAT等工具分析对快照文件。

查看Finalizer队列

下面的命令查看虚拟机Finalizer队列的信息: 
这里写图片描述
从图中可以看到,队列中堆积了大量的TestFinalizer$LY对象实例,还有其他一些对象。

查看ClassLoader信息

下面的命令显示了虚拟机当前的ClassLoader信息: 
这里写图片描述
从图中可以看到,当前虚拟机一共有3个ClassLoader,bootstrap加载了492个对象,对象总大小为943655byte,同时还显示了各个ClassLoader之间的父子关系。


概述

jhat(Java Head Analyse Tool)是jdk自带的用来分析Java堆快照的工具,具体的使用方法是:

jhat dump_file_name

使用示例

在此以前文dump出来的文件(dump.bin)为例,演示怎么使用jhat分析堆文件。 
这里写图片描述
这里写图片描述

上图中使用jhat命令打开了之前dump出来的堆快照文件,可以看到,命令成功执行后会在命令执行的本机启动一个http服务,可以在浏览器上打开本机的7000端口查看详细的分析结果:

这里写图片描述

页面中显示了所有非平台类信息,点击链接进入,可以查看选中的类的超类,ClassLoader以及该类的实例等信息。此外,在页面的地步,jhat还为开发人员提供了其他查询方式。如图所示:

这里写图片描述

通过这些链接,开发人员可以查看所有类信息(包含java平台的类),所有根节点,finalizer对象等等信息。最后提供了OQL查询工具,开发人员可以输入OQL语言查询相应的类。关于OQL,笔者就不过多介绍,想了解更多的可以点击这里了解。


概述

jstack可用于导出Java运用程序的线程堆栈,其基本使用语法为:

jstack [-l] pid

-l 选项用于打印锁的额外信息。

使用示例

下面这段代码运行之后会出现死锁现象(因为线程1持有lock1,在等待lock2,线程2持有lock2在等待lock1,造成了循环等待,形成死锁):

package com.winwill.deadlock;

/**
 * @author qifuguang
 * @date 15/6/4 16:45
 */
public class TestDeadLock {
    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();

    public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1) {
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    synchronized (lock2) {
                        System.out.println("线程1执行....");
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2) {
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    synchronized (lock1) {
                        System.out.println("线程2执行...");
                    }
                }
            }
        });

        t1.start();
        t2.start();
    }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

我们运行这段代码,然后使用jstack命令导出这个程序的线程堆栈信息:

[qifuguang@Mac~]$ jstack -l 21023 > /tmp/deadlock.txt

打开导出的线程堆栈信息文件,文件末尾如下所示:

这里写图片描述

如图所示,导出的线程堆栈文件中明确提示发现死锁,并且指明了死锁的原因。

总结

jstack不仅能够导出线程堆栈,还能自动进行死锁检测,输出线程死锁原因。


概述

在JDK 1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以用来导出堆,查看Java进程,导出线程信息,执行GC等。

使用示例

下面这个命令能够列出当前运行的所有虚拟机:

这里写图片描述

参数-l表示列出所有java虚拟机,针对每一个虚拟机,可以使用help命令列出该虚拟机支持的所有命令,如下图所示,以21024这个进程为例:

这里写图片描述

查看虚拟机启动时间VM.uptime

这里写图片描述

打印线程栈信息Thread.print

这里写图片描述

查看系统中类统计信息GC.class_histogram

执行如下命令:

[qifuguang@Mac~]$ jcmd 21024 GC.class_histogram

得到结果如下: 
这里写图片描述

导出堆信息GC.heap_dump

使用如下命令可以导出当前堆栈信息,这个命令功能和 jmap -dump 
功能一样

这里写图片描述

获取系统Properties内容VM.system_properties

这里写图片描述

获取启动参数VM.flags

这里写图片描述

获取所有性能相关数据PerfCounter.print

这里写图片描述

总结

从以上示例可以看出,jcmd拥有jmap的大部分功能,并且Oracle官方也建议使用jcmd代替jmap。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值