jdk命令行工具详解

现实企业级Java开发中,有时候我们会碰到下面这些问题:

  • OutOfMemoryError,内存不足。
  • 内存泄露。
  • 线程死锁。
  • 锁争用(Lock Contention)。
  • Java进程消耗CPU过高。
  • ...

要解决这些问题,我们需要掌握一些JVM的调优的命令,来帮助我们来进行错误的定位。

jps (输出JVM进程状况)

jps是最常用也是最基本的命令,该命令主要用于输出JVM进程状况,例子如下:

jps(JVM Process Status) 有点类似UNIX中的ps命令,可以列出正在运行的虚拟机进程,同时还可以显示出虚拟机运行主类(即main()所在的类)名称以及进程在本机的虚拟机ID–LVMID(Local Virtual Machine Identifier),功能很简单,但却是使用频率最高的命令行,因为后续的命令都要依据这个命令查出来的LVMID来进行操作。

命令格式

jps [options] [hostid]

option参数:

 -l: 输出主类全名或jar路径
 -q: 只输出LVMID
 -m: 输出JVM启动时传给main()的参数
 -v: 输出JVM启动时显示指定的JVM参数

其中[option]、[hostid]参数也可以不写。

示例

$ jps -l -m
  28920 org.apache.catalina.startup.Bootstrap start
  11589 org.apache.catalina.startup.Bootstrap start
  25816 sun.tools.jps.Jps -l -m

jmap(生成heap dump文件)

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。 jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

命令格式

jmap [option] LVMID

option参数

-dump : 生成堆转储快照
-finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
-heap : 显示Java堆详细信息
-histo : 显示堆中对象的统计信息
-clstats : 显示元空间内存状态,ps:该口令是JDK8开始使用,之前是-permstat
-F : 当-dump没有响应时,强制生成dump快照

示例

$ jmap -dump:live,format=b,file=dump.hprof 45995
Dumping heap to /Users/apple/dump.hprof ...
Heap dump file created

jstat(监视虚拟机运行时状态信息)

jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

命令格式

jstat [option] LVMID [interval] [count]

参数

[option] : 操作参数
LVMID : 本地虚拟机进程ID
[interval] : 连续输出的时间间隔
[count] : 连续输出的次数

option 参数总览

示例

$ jstat -gc 45995

jinfo(实时查看和调整虚拟机运行参数)

jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令.

命令格式

jinfo [option] [args] LVMID

option参数

-  -flag : 输出指定args参数的值。
-  -flags : 不需要args参数,输出所有JVM参数的值。
- -sysprops : 输出系统属性,等同于System.getProperties()。

示例

$ jinfo -flag 11494
-XX:CMSInitiatingOccupancyFraction=80

jhat(分析jmap生成的dump)

jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

命令格式

jhat [dumpfile]

option参数

 -stack false|true
关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.

 -refs false|true
关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。

 -port port-number
设置 jhat HTTP server 的端口号. 默认值 7000.

 -exclude exclude-file
指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。

 -baseline exclude-file
指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.

 -debug int
设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.

  -version
启动后只显示版本信息就退出

 -J< flag >
因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.

jstack(生成java虚拟机当前时刻的线程快照)

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

命令格式

jstack [option] LVMID

option 参数

-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈

示例

$ jstack -l 11494|more

参考

转载于:https://my.oschina.net/u/1187675/blog/1526971

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值