JVM总结之命令行工具

jps

jps位于jdk的bin目录下,其做用是显示当前系统的java进程状况,及其id号。 jps至关于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。所以,它查找全部的Java应用程序,包括即便没有使用java执行体的那种(例如,定制的启动 器)。html

jps仅查找当前用户的Java进程,而不是当前系统中的全部进程。java

jstack

Jstack是java虚拟机自带的一种堆栈跟踪工具。浏览器

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的缘由,如线程间死锁、死循环、请求外部资源致使的长时间等待等。app

经过对线程状态的查看,结合源码,通常都能找出hung住线程的缘由。jvm

线程状态工具

  • NEW,未启动的。不会出如今Dump中。
  • RUNNABLE,在虚拟机内执行的。
  • BLOCKED,受阻塞并等待监视器锁。
  • WATING,无限期等待另外一个线程执行特定操做。
  • TIMED_WATING,有时限的等待另外一个线程的特定操做。
  • TERMINATED,已退出的。

jstack的用法:学习

jstack [进程号]

可获得以下相似结果:spa

"main" #1 prio=5 os_prio=31 tid=0x00007fc918809800 nid=0x1c03 waiting on condition [0x0000700007a01000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.aheizi.cmd.JpsTest.main(JpsTest.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

再根据线程状态和具体代码进行分析。命令行

jmap

查看堆使用状况:线程

jmap -heap 2357

查看堆内存(histogram)中的对象数量及大小:

jmap -histo 2357

将内存使用的详细状况输出到文件:

jmap -dump:format=b,file=heapDump 2357

输出到文件以后能够经过jhat -port 7000 heapDump在浏览器访问http://localhost:7000/ 查看详细信息

Jmap使用心得

  1. 若是程序内存不足或者频繁GC,颇有可能存在内存泄露状况,这时候就要借助Java堆Dump查看对象的状况。
  2. 要制做堆Dump能够直接使用jvm自带的jmap命令
  3. 能够先使用jmap -heap命令查看堆的使用状况,看一下各个堆空间的占用状况。
  4. 使用jmap -histo:[live]查看堆内存中的对象的状况。若是有大量对象在持续被引用,并无被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
  5. 也可使用 jmap -dump:format=b,file=<fileName>命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容
  6. 在内存出现泄露、溢出或者其它前提条件下,建议多dump几回内存,把内存文件进行编号归档,便于后续内存整理分析。

jstat

jstat [ generalOption | outputOptions vmid [interval[s|ms][count]] ]

参数:
generalOption: 通常使用-gcutil查看GC状况
vmid: 虚拟机进程号,即当前运行的java进程号
interval: 间隔时间,单位为秒或毫秒
count: 打印次数,若是缺省则打印无数次

参数interval和count表明查询间隔和次数,若是省略这两个参数,说明只查询一次。假设须要每250毫秒查询一次进程2357垃圾收集情况,一共查询5次,那命令行以下:

jstat -gc 2357 250 5

参数说明以下:
S0: 新生代中Survivor space 0区已使用空间的百分比
S1: 新生代中Survivor space 1区已使用空间的百分比
E: 新生代已使用空间的百分比
O: 老年代已使用空间的百分比
P: 永久带已使用空间的百分比
YGC: 从应用程序启动到当前,发生Yang GC 的次数
YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
FGC: 从应用程序启动到当前,发生Full GC的次数
FGCT: 从应用程序启动到当前,Full GC所用的时间
GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

jhat

jhat前面已经用过了。使用jmap能够生成Java堆的Dump文件。生成dump文件以后就能够用jhat命令,将dump文件转成html的形式,而后经过http访问能够查看堆状况。

分析过程总结

获取Java Dump的方法

  1. 利用Java虚拟机,增长-XX:+HeapDumpOnOutOfMemoryError的配置,自动生成dump文件
  2. 使用JDK1.6自带的工具:Java VisualVM
  3. 使用命令行:jstack:打印线程的栈信息,制做线程Dump。jmap:打印内存映射,制做堆Dump。

步骤:

  1. 检查虚拟机版本(java -version)
  2. 找出目标Java应用的进程ID(jps)
  3. 使用jstack命令制做线程Dump / Linux环境下使用kill命令制做线程Dump
  4. 使用jmap命令制做堆Dump

参考资料:

Java命令学习系列

相关文章
相关标签/搜索