jvm(11) -- 虚拟机调试工具(上)

简介: jvm(11) -- 虚拟机调试工具(上)

一、命令行工具


1.jps


1dc618a0ed9580ce8bfa6facb208c08f.png


官网地址:


https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html


JVM Process Status Tool,显示虚拟机进程。


用法:jps [-q] [-mlvV]


参数说明


-q:打印进程号


-l:打印启动类的全限定名


-m:打印启动类的 main 方法入参


-v:打印指定的虚拟机参数


-V:打印类名


JPS(全称:Java Virtual Machine Process Status Tool)。安装JDK后在%JAVA_HOME%/bin目录下面自带的一个工具。用来查看计算机上面运行的JAVA进程。(如下图) 在Linux机器上我一般使用的ps -aux|grep java

5d4c6812c8535adbb050f4ddf2e1bce8.png


该工具只有16KB,所占内存很小。但是他会调用%JAVA_HOME%/lib/tools.jar里面的JAVA方法,来实现功能。


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


①jps -q 只显示进程号


C:\Users\Winston>jps -q

13476

2964

15224

9800


跟windows自带的任务管理器里面的PID就行比较,发现是一致的。此处windows进程里面少了一个。主要是少了我们当前运行的jps 命令。他也会发起一个java进程。

1dc618a0ed9580ce8bfa6facb208c08f.png


②jps -m


5d4c6812c8535adbb050f4ddf2e1bce8.png

jps -m 显示传递给main方法的参数。针对嵌入式JVM可能输出null.


46a9d80a6e05e4e3b19d57a0ee70bcdf.png66ba272a0bfc97be54a5fa679e3d5482.png


③ jps -l


显示运行程序主类的包名,或者运行程序jar包的完整路径。

1dc618a0ed9580ce8bfa6facb208c08f.png


④jps -v


打印指定的虚拟机参数


5d4c6812c8535adbb050f4ddf2e1bce8.png


④jps -V


打印类名


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


2.Jstat


官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHBBBDJ


Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。


66ba272a0bfc97be54a5fa679e3d5482.png

88b9988b40447cb37c7e3c492d49867f.png


每1秒,显示一下gc信息


1dc618a0ed9580ce8bfa6facb208c08f.png


jstat 用法


监视Java虚拟机(JVM)统计信息。此命令是实验性的,不受支持。

官网地址: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

使用情况,参考文章链接:https://www.jianshu.com/p/213710fb9e40

5d4c6812c8535adbb050f4ddf2e1bce8.png


option: 参数选项

-t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间

-h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头

vmid: Virtual Machine ID( 进程的 pid)

interval: 执行每次的间隔时间,单位为毫秒

count: 用于指定输出多少次记录,缺省则会一直打印

5d4c6812c8535adbb050f4ddf2e1bce8.png


option 可以从下面参数中选择


-class 显示ClassLoad的相关信息;


-compiler 显示JIT编译的相关信息;


-gc 显示和gc相关的堆信息;


-gccapacity    显示各个代的容量以及使用情况;


-gcmetacapacity 显示metaspace的大小


-gcnew 显示新生代信息;


-gcnewcapacity 显示新生代大小和使用情况;


-gcold 显示老年代和永久代的信息;


-gcoldcapacity 显示老年代的大小;


-gcutil   显示垃圾收集信息;


-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;


-printcompilation 输出JIT编译的方法信息;


示例一:-class


显示加载class的数量,及所占空间等信息。


jstat -class <pid>

1dc618a0ed9580ce8bfa6facb208c08f.png


Loaded : 已经装载的类的数量

Bytes : 装载类所占用的字节数

Unloaded:已经卸载类的数量

Bytes:卸载类的字节数

Time:装载和卸载类所花费的时间


示例二: -compiler


显示VM实时编译(JIT)的数量等信息。


jstat -compiler <pid>

1dc618a0ed9580ce8bfa6facb208c08f.png


Compiled:编译任务执行数量

Failed:编译任务执行失败数量

Invalid :编译任务执行失效数量

Time :编译任务消耗时间

FailedType:最后一个编译失败任务的类型

FailedMethod:最后一个编译失败任务所在的类及方法


示例三: -gc


显示gc相关的堆信息,查看gc的次数,及时间。


jstat –gc <pid>

1dc618a0ed9580ce8bfa6facb208c08f.png


S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

EC :年轻代中Eden(伊甸园)的容量 (字节)

EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)

OC :Old代的容量 (字节)

OU :Old代目前已使用空间 (字节)

MC:metaspace(元空间)的容量 (字节)

MU:metaspace(元空间)目前已使用空间 (字节)

YGC :从应用程序启动到采样时年轻代中gc次数

YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)

FGC :从应用程序启动到采样时old代(全gc)gc次数

FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)

还可以间隔xx毫秒,打印x条记录,比如下面间隔250毫秒,打印10条数据。


jstat -gc 17360 250 10

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 65536.0 7577.7 175104.0 144.0 18816.0 18379.0 2176.0 2082.2 1 0.023 0 0.000 0.023

10752.0 10752.0 0.0 3957.9 6553


示例四: -gccapacity


可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小


jstat -gccapacity <pid>

1dc618a0ed9580ce8bfa6facb208c08f.png


NGCMN :年轻代(young)中初始化(最小)的大小(字节)

NGCMX :年轻代(young)的最大容量 (字节)

NGC :年轻代(young)中当前的容量 (字节)

S0C :年轻代中第一个survivor(幸存区)的容量 (字节)

S1C : 年轻代中第二个survivor(幸存区)的容量 (字节)

EC :年轻代中Eden(伊甸园)的容量 (字节)

OGCMN :old代中初始化(最小)的大小 (字节)

OGCMX :old代的最大容量(字节)

OGC:old代当前新生成的容量 (字节)

OC :Old代的容量 (字节)

MCMN:metaspace(元空间)中初始化(最小)的大小 (字节)

MCMX :metaspace(元空间)的最大容量 (字节)

MC :metaspace(元空间)当前新生成的容量 (字节)

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC :从应用程序启动到采样时年轻代中gc次数

FGC:从应用程序启动到采样时old代(全gc)gc次数


示例五:-gcmetacapacity


metaspace 中对象的信息及其占用量。


jstat -gcmetacapacity<pid>

5d4c6812c8535adbb050f4ddf2e1bce8.png


MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC :从应用程序启动到采样时年轻代中gc次数

FGC :从应用程序启动到采样时old代(全gc)gc次数

FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)


示例六: -gcnew


年轻代对象的信息。


jstat -gcnew <pid>

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


S0C :年轻代中第一个survivor(幸存区)的容量 (字节)

S1C :年轻代中第二个survivor(幸存区)的容量 (字节)

S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

TT:持有次数限制

MTT:最大持有次数限制

DSS:期望的幸存区大小

EC:年轻代中Eden(伊甸园)的容量 (字节)

EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)

YGC :从应用程序启动到采样时年轻代中gc次数

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)


示例七: -gcnewcapacity


年轻代对象的信息及其占用量


jstat -gcnewcapacity <pid>

66ba272a0bfc97be54a5fa679e3d5482.png


NGCMN :年轻代(young)中初始化(最小)的大小(字节)

NGCMX :年轻代(young)的最大容量 (字节)

NGC :年轻代(young)中当前的容量 (字节)

S0CMX :年轻代中第一个survivor(幸存区)的最大容量 (字节)

S0C :年轻代中第一个survivor(幸存区)的容量 (字节)

S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

EC:年轻代中Eden(伊甸园)的容量 (字节)

YGC:从应用程序启动到采样时年轻代中gc次数

FGC:从应用程序启动到采样时old代(全gc)gc次数


示例八: -gcold


old代对象的信息


jstat -gcold <pid>

1dc618a0ed9580ce8bfa6facb208c08f.png


MC :metaspace(元空间)的容量 (字节)

MU:metaspace(元空间)目前已使用空间 (字节)

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

OC:Old代的容量 (字节)

OU:Old代目前已使用空间 (字节)

YGC:从应用程序启动到采样时年轻代中gc次数

FGC:从应用程序启动到采样时old代(全gc)gc次数

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)


示例九:-gcoldcapacity


old代对象的信息及其占用量

jstat -gcoldcapacity <pid>

5d4c6812c8535adbb050f4ddf2e1bce8.png


OGCMN :old代中初始化(最小)的大小 (字节)

OGCMX :old代的最大容量(字节)

OGC :old代当前新生成的容量 (字节)

OC :Old代的容量 (字节)

YGC :从应用程序启动到采样时年轻代中gc次数

FGC :从应用程序启动到采样时old代(全gc)gc次数

FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)


示例十: - gcutil


统计gc信息


jstat -gcutil <pid>

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

E :年轻代中Eden(伊甸园)已使用的占当前容量百分比

O :old代已使用的占当前容量百分比

P :perm代已使用的占当前容量百分比

YGC :从应用程序启动到采样时年轻代中gc次数

YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)

FGC :从应用程序启动到采样时old代(全gc)gc次数

FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)


示例十一:-gccause


显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因。

jstat -gccause <pid>

66ba272a0bfc97be54a5fa679e3d5482.png

LGCC:最后一次GC原因

GCC:当前GC原因(No GC 为当前没有执行GC)


示例十二: -printcompilation


当前VM执行的信息。


jstat -printcompilation <pid>

1dc618a0ed9580ce8bfa6facb208c08f.png

Compiled :编译任务的数目

Size :方法生成的字节码的大小

Type:编译类型

Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的.


3.Jinfo


jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息.



官网地址:


<https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html>


jinfo用法:


参考博客地址:


<https://www.jianshu.com/p/8d8aef212b25>


jinfo 用法


jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息.


5d4c6812c8535adbb050f4ddf2e1bce8.png


参数说明


pid 对应jvm的进程id

executable core 产生core dump文件

[server-id@]remote server IP or hostname 远程的ip或者hostname,server-id标记服务的唯一性id


option


no option 输出全部的参数和系统属性

-flag name 输出对应名称的参数

-flag [+|-]name 开启或者关闭对应名称的参数

-flag name=value 设定对应名称的参数

-flags 输出全部的参数

-sysprops 输出系统属性


Javacore 概述


Javacore,也可以称为“threaddump”或是“javadump”,它是 Java 提供的一种诊断特性,能够提供一份可读的当前运行的 JVM 中线程使用情况的快照。即在某个特定时刻,JVM 中有哪些线程在运行,每个线程执行到哪一个类,哪一个方法。

应用程序如果出现不可恢复的错误或是内存泄露,就会自动触发 Javacore 的生成。


示例一: no option


命令:jinfo pid

描述:输出当前 jvm 进程的全部参数和系统属性


1dc618a0ed9580ce8bfa6facb208c08f.png


示例二: -flag name


命令:jinfo -flag name pid

描述:输出对应名称的参数

5d4c6812c8535adbb050f4ddf2e1bce8.png


相关文章
|
2月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
42 0
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
57 1
|
前端开发 Java 应用服务中间件
【Java虚拟机】JVM类加载机制和双亲委派模型
【Java虚拟机】JVM类加载机制和双亲委派模型
【Java虚拟机】JVM类加载机制和双亲委派模型
|
安全 Java 应用服务中间件
深入理解JVM虚拟机6:深入理解JVM类加载机制
深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
|
2月前
|
Ubuntu 网络安全 虚拟化
VMware虚拟机ping不通原因排查及分析
下面以 VMware 虚拟机为例进行介绍。
1181 3
|
2月前
|
存储 SQL 数据库
虚拟化数据恢复—Vmware虚拟机误还原快照的数据恢复案例
虚拟化数据恢复环境: 一台虚拟机从物理机迁移到ESXI虚拟化平台,迁移完成后做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了数年的数据。 ESXI虚拟化平台上有数十台虚拟机,EXSI虚拟化平台连接了一台EVA存储,所有的虚拟机都存放在EVA存储上。 虚拟化故障: 工组人员误操作将数年前迁移完成后做的快照还原了,也就意味着虚拟机状态还原到数年前,近几年数据都被删除了。 还原快照相当于删除数据,意味着部分存储空间会被释放。为了不让这部分释放的空间被重用,需要将连接到这台存储的所有虚拟机都关掉,需要将不能长时间宕机的虚拟机迁移到别的EXSI虚拟化平台上。
116 50
|
3月前
|
安全 虚拟化 数据中心
Xshell 连接 VMware虚拟机操作 截图和使用
Xshell 连接 VMware虚拟机操作 截图和使用
88 4