Java虚拟机—命令行监控工具

给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。

JDK主要命令行监控工具

  1. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
  2. jstat :JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据。
  3. jinfo: Configuration info for Java,显示虚拟机配置信息。
  4. jmap: Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件)。
  5. jhat:JVM Heap Dump Browser,用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果。
  6. jstack:Stack Trace for Java,显示虚拟机的线程快照。

jps:虚拟机进程状况工具

jps命令可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(Process Identifier,PID)是一致的,使用Windows的任务管理器或者UNIX的ps命令也可以查询到虚拟机进程的LVMID,但如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖jps命令显示主类的功能才能区分了。


jps命令格式:

jps [ options ][ hostid ]
复制代码

jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。jps的其他常见选项如下:

  • -q:只输出LVMID,省略主流的名称。
  • -m:输出虚拟机进程启动时传递给主类main()函数的参数。
  • -l:输出主流的全名,如果进程执行的Jar包,输出Jar路径 。
  • -v:输出虚拟机进程启动时JVM参数。

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

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾垃圾、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。


jstat命令格式为

jstat [ option vimd [interval[s|ms] [count]]]
复制代码

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:

[protocol:][//]lvmid[@hostname[:port]/servername]
复制代码

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:

jstat -gc 2764 250 20
复制代码

选项option代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况。

jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 1.6或以上版本的话,使用java -XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择),jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties()的内容打印出来。


jinfo命令格式

jinfo [ option ] pid
复制代码

jmap:Java内存映射工具

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


jmap命令格式

jmap [ option ] vmid
复制代码

option选项如下:

  • -dump:生成Java堆转储快照。格式为:-dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象。
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。
  • -heap:显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。
  • -histo:显示堆中对象统计信息,包括类、实例数量、合计容量。
  • -permstat:以ClassLoader为统计口径显示永久代内存状态。

如果不使用jmap命令,要想获取Java堆转储快照,还有一些比较“暴力”的手段:

  • -XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件;
  • -XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成dump文件;
  • 在Linux系统下通过Kill -3命令发送进程退出信号“吓唬”一下虚拟机,也能拿到dump文件。

jstack:Java堆栈跟踪工具

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


jstack命令格式

jstack [ option ] vmid
复制代码

option选项如下

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

HSDIS:JIT生成代码反汇编

随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的内容产生了越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”)——即实现只能保证规范描述等效。基于这个原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。

HSDIS是一个Sun官方推荐的HotSpot虚拟机JTF编译代码的反汇编插件,它包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。


如果读完觉得有收获的话,欢迎点赞、关注、加公众号【牛觅技术】,查阅更多精彩历史!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值