十一、JVM调优-命令篇

来源:互联网 发布:nat穿越java实现 编辑:程序博客网 时间:2024/06/06 17:38
运行JVM自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然JVM调优成熟的工具已经有很多:jconsole,大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面我们总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于JDK的接口和底层的这些命令,研究这些命令的使用也让我们更能了解JVM的构成和特性。Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo下面做一一介绍。

1、jps 查看本机的Java中进程信息。
jps是JDK提供的一个查看当前Java进程的小工具,可以看做是Java Vritual Machine Process Status Tool的缩写。非常简单实用。
JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
命令格式
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
2、jstack 打印线程的栈信息,制作线程Dump。
什么是Java Dump?
Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。
线程Dump,包含所有线程的运行状态。纯文本格式。
堆Dump,包含线程Dump,还包含所有堆对象的状态。二进制格式。
Java Dump有什么用?
补足传统Bug分析手段的不足:可在任何Java环境使用;信息量充足。针对非功能正确性的Bug,主要为:多线程开发,内存泄漏。

jstack用于打印出给定的Java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:jstack [-l] pidjstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。所以jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。

命令格式:
jstack[option]pidjstack [option] executable core
$jstack [option] [srever-id@]remote-hostname-or-IP
参数说明:
pid:java应用程序的进程号,一般可以通过jps来获得;
executable:产生core dump的java可执行程序;
core:打印出的core文件;
remote-hostname-or-ip:远程debug服务器的名称或IP;
sever-id:唯一id;假如一台主机上多个远程debug服务;
option参数
. -F:当正常输出请求不被响应时,强制输出线程堆栈
. -l:除堆栈外,显示关于锁的附加信息
. -m:如果调用到本地方法的话,可以显示C/C++的堆栈

原创粉丝点击