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


相关文章
|
9月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
224 27
|
10月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
10月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
220 28
|
9月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
9月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
4月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
411 55
|
5月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
394 6
|
8月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
881 166
|
10月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1695 1
|
6月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
305 29
JVM简介—1.Java内存区域