Java 自带工具常用命令

Javap

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作.

  • 查看帮助信息:javap -help
  • 查看版本:javap -version
  • 输出行和局部变量表:javap -l
  • 仅显示public类和成员:javap -public
  • 显示protected/public类和成员:javap -protected
  • 显示package/protected/public类和成员 (默认):javap -package
  • 显示所有类和成员:javap -p javap -private
  • 输出内部类型签名:javap -s
  • 对代码进行反汇编:javap -c
  • 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本:javap -v javap -verbose
  • 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5散列):javap -sysinfo
  • 显示静态最终常量:javap -constants

JPs

jps(Java Process Status),虚拟机进程状态工具。可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()方法所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。

jps [options][hostid]

  • 只输出LVMID,不输出主类名字:jps -q
  • 输出虚拟机进程启动时传递给主类main函数的参数:jps -m
  • 输出主类的全名,如果是jar包则输出jar包路径:jps -l
  • 输出虚拟机进程启动时JVM参数:jps -v

JStat

jstat(Java Statistics Monitoring Tool),虚拟机统计信息监视工具。用于监视虚拟机各种运行状态信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据。在没有GUI情况下,这是运行期定位虚拟机性能问题的首选工具。

jstat [option vmid [interval[s|ms] [count]]]

命令格式中的VMID和LVMID需要说明下,如果是本地虚拟机进程,那么VMID和LVMID是一致的,如果是远程虚拟机进程,那VMID格式是

[protocol:][//]lvmid [@hostname[:port] / servername]

参数interval和count代表查询间隔和次数,如果省略这两个参数,那么只查询一次。option代表用户希望查询的虚拟机信息,主要包括3类:类装载、垃圾回收、运行期变异状况。具体如下。

  • 监视类装载、卸载数量、总空间以及类装载所耗费时间:jstat -class
  • 监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等:jstat -gc
  • 输出Java堆各个区域使用到的最大、最小空间:jstat -gccapacity
  • 输出已使用空间占总空间的百分比:jstat -gcutil
  • 输出上一次GC的原因:jstat -gccause
  • 监视新生代GC状况:jstat -gcnew
  • 监视新生代GC状况,关注使用到的最大、最小空间:jstat -gcnewcapacity
  • 监视老年代GC状况:jstat -gcold
  • 监视老年代GC状况,关注使用到的最大、最小空间:jstat -gcoldcapacity
  • 输出永久代的最大、最小空间:jstat -gcpermcapacity
  • 输出JIT编译器编译过的方法、耗时等信息:jstat -compiler
  • 输出已经被JIT编译的方法:jstat -printcompilation

JInfo

jinfo(Configuration Info for Java),Java配置信息工具。作用是可以实时地查看和调整虚拟机各项参数。

jinfo [ option ] < pid >

  • 查看所有参数:jinfo -flags <pid>
  • 查看未被显示指定的参数的系统默认值:jinfo -flag [name] <pid>
  • 查看未被显示指定的参数的系统默认值(JDK1.6-):java -XX:+PrintFlagsFinal
  • 修改运行期虚拟机参数:jinfo -flag [+/-] name jinfo -flag <name>=<value>
  • 输出虚拟机进程的System.getProperties()的内容:jinfo -sysprops <pid>

JMap

jmap(Memory Map for Java),Java内存映像工具,用于生成堆转储快照(一般称为heapdump文件或dump文件)。jmap的作用不仅仅是获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细,如空间使用率、当前用的是哪种回收器等。

jmap [ option ] vmid

  • 生成Java堆转储快照:jmap -dump [live, ] format=b, file=<filename>
  • 当虚拟机对-hump 选项没有响应时,强制生成dump快照,只在Linux/Solaris平台有效:jmap -F
  • 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台有效:jmap -finalizerinfo
  • 显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台有效:jmap -heap
  • 显示堆中对象统计信息,包括类、实例对象、合计容量:jmap -histo
  • 以ClassLoader为统计口径显示永久代内存状态,只在Linux/Solaris平台有效:jmap permstat

JHat

jhatzhuanch (JVM Heap Analyisi Tool),虚拟机堆转储快照分析工具。


JStack

jstack(Stack Trace for Java),Java堆栈工具,用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内为每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待什么资源。

jstack [ option ] < vmid >

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

在JDK1.5中,java.lang.Thread新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成了jstack的大部分功能,在实际项目中可以调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。


JConsole

JConsole(Java Monitoring and Management Console),是一种基于JMX的可视化监视、管理工具。它管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问,所以重点是使用JConsole的监视功能。


JVisualVM

JVisualVM(All-in-One Java Troubleshooting Tool),Java多合一故障处理工具。是目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。而且还有很多高效的插件可以使用。

其他

  • 运行期间dump出class类: sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" -Dsun.jvm.hotspot.tools.jcore.filter=sun.jvm.hotspot.tools.jcore.PackageNameFilter -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=<package-name> sun.jvm.hotspot.tools.jcore.ClassDump <pid>