说明:书中作者介绍的的基于 windows 平台下的 JDK1.6 Update 21

可以参考:

http://www.cnblogs.com/SilentHYmn/p/5186486.html

http://blog.csdn.net/coslay/article/details/48932277

# JDK 命令行工具

# 前言

① JDK 命令行工具基本位于 bin 目录下,主要功能代码位于 jdk/lib/tools.jar 中,Linux 中有很多直接是 shell 脚本写的;

② 包含功能强大的监控分析功能;

③ JDK1.5 要开启 JMX 管理功能,-Dcom.sun.managerment.jmxremote;1.6 默认开启

④ Sun JDK 监控和故障处理工具:

属性作用
-p只输出 LVMID,省略主类的名称
-m输出虚拟机进程启动时传递给主类 main()函数的参数
-l输出主类的全名,如果进程执行的是 jar 包,输出 jar 路径
-v输出虚拟机进程启动时 jvm 参数

# jps:虚拟机进程状况工具

① 使用频率最高的 JDK 命令行工具;

② 格式: jps [ options ] [ hostid ]

③ jps 可以通过 RMI 协议查询开启了 RMI 服务的远程虚拟机进程状态,上面的 hostid 即为 RMI 注册表中注册的主机名;

④ 参数:-q、-m、-l、-v;

# jstat:虚拟机统计信息监视工具

① 用于监视虚拟机各种运行状态信息

② 可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据;

③ 格式: jstat [ option vmid [ interval[s|ms][count] ] ]

④ vmid 与 lvmid:若是本地虚拟机进程,vmid 和 lvmid 一致;若是远程虚拟机进程,vmid 格式为:[protocol:] [ // ] lvmid [ @hostname:[ :port ]/servername ]

⑤ interval 和 count:查询间隔和次数;

⑥ option:代表用户希望查询的虚拟机信息,分 3 类:类装载、垃圾收集、运行期编译状况;

⑦ 实例: jstat -gc 2764 250 20;意思是每 250ms 查询一次进程 2764 垃圾收集状况,一共查询 20 次;

⑧ jstat 工具主要选项(参数):

选项作用
-class监视装载类、卸载类、总空间以及类装载所耗费的时间
-gc监视 java 堆状况,包括 eden 区、两个 survivor 区、老年代、永久代等的容量、已用空间、GC 时间合计信息
-gccapacity监视内容与 - gc 基本相同,但输出主要关注 java 堆各个区域使用到最大、最小空间
-gcutil监视内容与 - gc 基本相同,但输出主要关注已使用控件占总空间的百分比
-gccause与 - gcutil 功能一样,但是会额外输出导致上一次 gc 产生的原因
-gcnew监视新生代 GC 情况
-gcnewcapacity监视内容与 - gcnew 基本相同,输出主要关注使用到的最大、最小空间
-gcold监视老年代 GC 情况
-gcoldcapacity监视内容与 - gcold 基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity输出永久代使用到的最大、最小空间
-compiler输出 JIT 编译过的方法、耗时等信息
-printcompilation输出已经被 JIT 编译过的方法

⑨ 执行样例

  • E 表示 Eden 区使用了 2% 的空间;
  • S0、S1 表示 Survivor 区为空的;
  • O 表示老年代为空;
  • P 表示永久代使用了 13.84%;
  • YGC 表示程序运行以来共发生 Minor GC o 次;
  • FGC 表示 Full GC 共发生 0 次;
  • GCT 表示所有 GC 总耗时 0 秒;

# jinfo:java 配置信息工具

① 作用:实时查看和调整虚拟机各项参数;

② 格式: jinfo [ option ] pid ;

③ 实例:查询 CMSInitiatingOccupancyFraction 参数值: jinfo -flag CMSInitiatingOccupancyFraction 1444

# jmap:java 内存映像工具

① 作用:用于生成堆转储快照(一般称为 heapdump 或 dump 文件),查询 finalize 执行队列、java 堆和永久代的详细信息(如空间使用率、当前用的是哪种收集器等);

② 格式: jmap [ option ] vmid ;

选项作用
-dump生成 java 堆转储快照。格式为: -dump:[live,] format=b,file=<filename>, 其中 live 子参数说明是否只 dump 出存活的对象
-finalizerinfo显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。只在 Linux/Solaris 平台下有效
-heap显示 java 堆详细信息,如使用哪种收集器、参数配置、分代情况等,在 Linux/Solaris 平台下有效
-jisto显示堆中对象统计信息,包含类、实例对象、合集容量
-permstat以 ClassLoader 为统计口径显示永久代内存状态。只在 Linux/Solaris 平台下有效
-F当虚拟机进程对 - dump 选项没有相应时。可使用这个选项强制生成 dump 快照。只在 Linux/Solaris 平台下有效

③ 实例:使用 jmap 生成一个正在运行的 Eclipse 的 dump 快照文件,例子中 3500 是通过 jps 命令查询到的 lvmid: jmap -dump:format=b,file=eclipse.bin 3500

# jhat:虚拟机堆转储快照分析工具

① 与 jmap 搭配使用,分析结果可在浏览器中查看;

② 作者建议不适用这个工具,有俩原因功能简陋且分析耗时;

# jstack:java 堆栈跟踪工具

① 作用:用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore 文件),生成目的主要是定位线程出现长时间停顿的原因,如死锁、死循环、请求超时等;

② 格式: jstack [ option ] vmid ;

③ 选项(参数):

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

# HSDIS:JIT 生成代码反汇编

① 说明:Sun 推荐的 HotSpot 虚拟机 JIT 编译代码的反汇编插件,包含在 HotSpot 虚拟机源码中;

② 作用:让 HotSpot 的 - XX:+PrintAssembly 指令调用它来把动态生成的动态代码还原为汇编代码输出,同时生成大量非常有价值的注释;