本篇记录JVM常用的指令,通过Java的bin目录下强大的工具就能进行查看。
其中很多命令参考option参数,自己要多敲几遍才能记住。
JVM常用命令
其中[]方括号内的参数,表示可有可无。
jps
JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
命令格式
option参数
示例:
最前面数字表示PID,后面有用到。
jstat
jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
命令格式
option参数
Option | 解释 |
---|---|
class | class loader的行为统计。Statistics on the behavior of the class loader. |
compiler | HotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler. |
gc | 垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap. |
gccapacity | 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces. |
gcutil | 垃圾回收统计概述。Summary of garbage collection statistics. |
gccause | 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and |
gcnew | 新生代行为统计。Statistics of the behavior of the new generation. |
gcnewcapacity | 新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces. |
gcold | 年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations. |
gcoldcapacity | 年老代行为统计。Statistics of the sizes of the old generation. |
gcpermcapacity | 永生代行为统计。Statistics of the sizes of the permanent generation. |
printcompilation | HotSpot编译方法统计。HotSpot compilation method statistics. |
例如查看垃圾回收堆的行为统计
顺便介绍一下参数意义:
C:Capacity表示的是容量 U:Used表示的是已使用
上面有很多个option参数,可以一个个敲过去看看具体的作用。
jmap
jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候,自动生成dump文件。
jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。
命令格式
option参数
举个🌰
- -dump
|
|
输出.dprof文件后,使用MAT分析工具进行分析
- -heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
|
|
jhat
jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。
因为常用分析方法是用各平台通用的MAT进行分析,就不具体在远程服务器操作展示效果了。
jstack
jstack用于生成java虚拟机当前时刻的线程快照。
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
命令格式
option参数
举个例子
jinfo
jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。
之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令
一般我常用它来看JVM启动时的参数
命令格式
optin参数
举个🌰
从上面可以看到,jinfo打印出来的参数,下一篇原本想写MAT的使用,但是自己手动制造过异常,异常信息集中在Java Objects,只要联想到跟上一次改动过的代码,就能发现大对象可能出现的地方,所以具体分析的话,等之后拿到比较复杂的dump文件再具体学习。
参考资料
1、《jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)》
2、Java8内存模型—永久代(PermGen)和元空间(Metaspace)
3、周志明的《深入理解JVM》