1.JVM Statistics Monitoring Tool (虚拟机统计信息监视工具)
jstat 是用于监视虚拟机各种运行状态信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,是运行期定位虚拟机性能的常用工具。
jstat命令格式为:
jstat [ option vmid [interval[s|ms] [count]] ]
对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的;如果是远程虚拟机进程,那VMID的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:
jstat -gc 2764 250 20
选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况。详细请参考表4-2中的描述。
如何查看监视结果。监视参数与输出结果如代码清单4-1所示。
jstat -gcutil 2764
查询结果表明:这台服务器的新生代Eden区(E,表示Eden)使用了6.2%的空间,2个Survivor区(S0、S1,表示Survivor0、Survivor1)里面都是空的,老年代(O,表示Old)和永久代(P,表示Permanent)则分别使用了41.42%和47.20%的空间。程序运行以来共发生Minor GC(YGC,表示YoungGC)16次,总耗时0.105秒;发生Full GC(FGC,表示Full GC)3次,总耗时(FGCT,表示Full GCTime)为0.472秒;所有GC总耗时(GCT,表示GC Time)为0.577秒。
2.jstack:Java堆栈跟踪工具
jstack (stack Trace for java)命令用于生产虚拟机当前时刻的线程快照(一般称为threaddump 或者javacore文件)。线程快照就是单前虚拟机内每一条线程**正在执行的方法堆栈的集合**,生产线程快照的目的通常是定位线程长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的原因。线程出现停顿时,通过jstack来查看各个线程的调用堆栈,就可以获知没有响应线程到底在后台做些什么事情,或者等待什么资源。
jstack命令格式:
jstack [ option ] vmid
option选项的合法值与具体含义如表所示。
使用jstack查看Eclipse线程堆栈的例子,例子中的3500是通过jps命令查询到的LVMID。
3.jmap:Java内存映像工具
jmap(Memory Map for java)命令用于生成堆快照(一般称为heapdump或dump文件)。如果不使用jmap命令,想要获取java堆转储快照也还有一些比较“暴力”的手段:如XX: +HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出的时候自动生成堆转储快照文件,通过-XX: +HeapDumpOnCtrlBreak 参数则可以使用【Ctrl】+【Break】键让虚拟机生成堆转储快照文件,又或者在Linux系统下通过kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。
jmap的作用并不仅仅是为了获取堆转储快照,他还可以查询finalize执行队列、java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
和jinfo命令一样,jmap有部分功能在Windows平台下是受限的,除了生成堆转储快照的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统中都可以使用之外,其余选项都只能在Linux/Solaris中使用。
jmap命令格式:
jmap [ option ] vmid
option选项的合法值与具体含义如表4-3所示。
使用jmap生成一个正在运行的Eclipse的堆转储快照文件的例子,例子中的3500是通过jps命令查询到的LVMID。