本文内容过于硬核,建议有 Java 相关经验人士阅读。

1. 引言

虽然我们前面介绍了各种图形化 JVM 故障处理工具,但是很多情况下,我们在处理问题的时候并没有图形化的操作环境可以使用,这时候,就需要用到 JDK 为我们提供的命令行工具了。

2. jps: 虚拟机进程状况工具

jps 绝对是使用频率最高的 JDK 命令行工具,它的作用是可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( Main Class , main() 函数所在的类)名称以及这些进程的本地虚拟机唯一 ID ( LVMID , LocalVirtual Machine Identifier )。

命令格式:

jps [options ] [ hostid ]

执行样例:

PS D:\> jps -l
5200 org.jetbrains.jps.cmdline.Launcher
16868 jdk.jcmd/sun.tools.jps.Jps
19368 org.jetbrains.idea.maven.server.RemoteMavenServer36

可以看到我本机,有三个 JVM 进程, 5200 和 19368 是软件 IDEA 的进程,从类名上是可以看出来的,还有一个是 jps 本身的这个 JVM 进程。

列举一些常用参数:

可选项 作用
-l 输出完全的包名,应用主类名,jar的完全路径名。
-q 仅输出 VM 标识符,不包括 classname , jar name , arguments in main method 。
-m 输出 main method 的参数。
-v 输出 JVM 参数。

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

jstat(JVM Statistics Monitoring Tool) 是用于监视虚拟机各种运行状态信息的命令行工具。

位于 JDK 的 bin 目录下,主要利用 JVM 内建的指令对 Java 应用程序的资源和性能进行实时的命令行的监控,包括了对 Heap size 和垃圾回收状况的监控。

jstat 工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程 id ,和所选参数。参考格式如下:

jstat -options

可以列出当前 JVM 版本支持的选项,常见的有:

  • -class (类加载器)
  • -compiler (JIT)
  • -gc (GC堆状态)
  • -gccapacity (各区大小)
  • -gccause (最近一次GC统计和原因)
  • -gcnew (新区统计)
  • -gcnewcapacity (新区大小)
  • -gcold (老区统计)
  • -gcoldcapacity (老区大小)
  • -gcpermcapacity (永久区大小)
  • -gcutil (GC统计汇总)
  • -printcompilation (HotSpot编译统计)

比如我想查看一下我本地的 IDEA 进程的 GC 情况汇总,可以使用命令:

PS D:\> jstat -gcutil 5200
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 43.29 20.83 0.08 97.05 93.67 1 0.003 0 0.000 - - 0.003

查询结果表明:

我的 IDEA 的新生代 Eden 区( E ,表示 Eden )使用了 20.83% 的空间, 2 个 Survivor 区( S0 、 S1 ,表示 Survivor0 、 Survivor1 ),S0 是空的,而 S1 使用了 43.29% ,老年代( O ,表示 Old )使用了 0.08% 的空间,元空间( M , 表示 Metaspace )使用了 97.05% 的空间。

程序运行以来共发生 Minor GC ( YGC ,表示 Young GC ) 1 次,总耗时 0.003 秒,发生 Full GC ( FGC ,表示 Full GC )0 次,总耗时( FGCT ,表示 Full GC Time )为 0 秒,所有 GC 总耗时( GCT ,表示 GC Time )为 0.003 秒。

4. jinfo: Java 配置信息工具

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

使用 jps 命令的 -v 参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用 jinfo 的 -flag 选项进行查询了。

jinfo 命令格式:

jinfo [option] pid

查询样例:

PS D:\> jinfo -flags 5200
VM Flags:
-XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

5. jmap: Java 内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。

它也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

jmap 命令格式:

jinfo [option] pid

option 可选的参数:

  • no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
  • heap: 显示 Java 堆详细信息
  • histo[:live]: 显示堆中对象的统计信息
  • clstats:打印类加载器信息
  • finalizerinfo: 显示在 F-Queue 队列等待 Finalizer 线程执行 finalizer 方法的对象
  • dump::生成堆转储快照
  • F: 当 -dump 没有响应时,使用 -dump 或者 -histo 参数. 在这个模式下, live 子参数无效.
  • help:打印帮助信息
  • J:指定传递给运行 jmap 的 JVM 的参数
PS D:\> jmap -dump:format=b,file=idea.bin 5200
Dumping heap to D:\idea.bin ...
Heap dump file created

6. jhat: 虚拟机堆转储快照分析工具

JDK 提供jhat(JVM Heap Analysis Tool)命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。 jhat 内置了一个微型的 HTTP/Web 服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。

使用命令为:

PS D:\> jhat idea.bin
Reading from idea.bin...
Dump file created Thu Oct 08 18:54:37 CST 2020
Snapshot read, resolving...
Resolving 147921 objects...
Chasing references, expect 29 dots.............................
Eliminating duplicate references.............................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

然后在浏览器上访问地址 http://localhost:7000/ 可以看到分析结果,不过这个分析工具一般没什么人会用,因为功能太过简陋了。

相比较而言,我们可以使用 VisualVM 或者 Eclipse Memory Analyzer 再或者 IBM HeapAnalyzer 等工具分析刚才 jmap 产生的 dump 文件。

7. jstack: Java 堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore 文件)。

线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。

jstack 命令格式:

jstack [option] pid

option 的可选参数:

  • -F: 当正常输出的请求不被响应时,强制输出线程堆栈。
  • -l: 除堆栈外,显示关于锁的附加信息。
  • -m: 如果调用到本地方法的话,可以显示 C/C++ 的堆栈。
PS D:\> jstack -l 5200
2020-10-08 19:03:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.221-b11 mixed mode): "DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x00000000037b8000 nid=0x3f20 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE Locked ownable synchronizers:
- None

JVM 第五篇:命令行 JVM 故障处理工具的更多相关文章

  1. vim第五章 命令行模式

    vim第五章命令行模式 技巧 27 结识vim的命令行模式 在命令行模式中执行的命令有被称作ex命令    在按/调出查找提示符或者<C-r>=访问表示寄存器时 命令行模式也被激活     ...

  2. golang常用库:cli命令行/应用程序生成工具-cobra使用

    golang常用库:cli命令行/应用程序生成工具-cobra使用 一.Cobra 介绍 我前面有一篇文章介绍了配置文件解析库 Viper 的使用,这篇介绍 Cobra 的使用,你猜的没错,这 2 个 ...

  3. Linux系统——28个命令行下的工具

    Unix/Linux下的28个命令行下的工具 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些是不 ...

  4. APICloud提供适用于命令行的开发工具,开发更具极客精神!

    APICloud近期大动作不断,上周刚刚支持Atom编辑器,并推出核心开发工具库.本周又为开发者提供了一款超轻便的新开发工具--CLI工具! 操作系统: Mac/Windows/Linux nodej ...

  5. VMware10中的CentOS6.5命令行安装VMwaretools工具启用windows与虚拟机中Linux系统的共享目录

    VMware10中的CentOS6.5命令行安装VMwaretools工具启用windows与虚拟机中Linux系统的共享目录 一.描述 系统描述:win7旗舰版64位系统+VMware Workst ...

  6. [Linux] jq:命令行JSON处理工具

    jq命令帮助我们很方便地在终端查看和处理json文件 jq命令的帮助信息: abby@abby:bgs$ jq -h jq - commandline JSON processor [version ...

  7. 命令行视频下载工具 you-get 和 youtube-dl

    you-get 和 youtube-dl 都是基于 Python 的命令行媒体文件下载工具,完全开源免费跨平台.用户只需使用简单命令并提供在线视频的网页地址即可让程序自动进行嗅探.下载.合并.命名和清 ...

  8. PHP 命令行参数解析工具类

    <?php/** * 命令行参数解析工具类 * @author guolinchao * @email luoyecb@163.com */class CommandLine{ // store ...

  9. JVM 第四篇:可视化 JVM 故障处理工具

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 可视化工具 在 JDK 中为我们提供了大量的 JVM 故障处理工具,都在 JDK 的 bin 目录下: 这其中除了大量的命令行工具以外,还 ...

随机推荐

  1. 分布式ID方案SnowFlake雪花算法分析

    1.算法 SnowFlake算法生成的数据组成结构如下: 在java中用long类型标识,共64位(每部分用-分开): 0 - 0000000000 0000000000 0000000000 000 ...

  2. Spring JPA 定义查询方法

    Spring JPA 定义查询方法 翻译:Defining Query Methods ​ 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 ​ 可用选项基于 ...

  3. Kubernetes 存活、就绪探针

    在设计关键任务.高可用应用程序时,弹性是要考虑的最重要因素之一. 当应用程序可以快速从故障中恢复时,它便具有弹性. 云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中.为了确保Kuber ...

  4. 软件开发过程中常用的环境解释DEV FAT UAT PRO

    1.DEV Development environment 开发环境,用于开发者调试使用 2.FAT Feature Acceptance Test environment 功能验收测试环境,用于软件 ...

  5. vue项目Windows Server服务器部署IIS设置Url重写

    1.将vue项目使用npm run build命令打包后将dist文件夹内的文件全部拷贝到服务器. 2.IIS添加应用程序池,.NET CLR版本选择无托管代码 3.添加网站,应用程序池选择刚刚添加的 ...

  6. PyCharm2020.2.1激活方法

    本人亲测有效!直接看图! 安装准备 一.百度网盘链接:https://pan.baidu.com/s/151vnrZG2V4eMPW8RYqse3w   提取码:z5k0 至于Pycharm的安装在这 ...

  7. Vue Render自定义tabled单元格内容

    解决问题 只举一个例子(我正好需要用到的) 在写中后台时, 如果对 表格组件 再度封装了, 比如这样的 以element-ui 为例: <template> <el-table :d ...

  8. Java 基础知识面试题(2020 最新版)

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大 ...

  9. 五分钟带你读懂 TCP全连接队列(图文并茂)

    爱生活,爱编码,微信搜一搜[架构技术专栏]关注这个喜欢分享的地方. 本文 架构技术专栏 已收录,有各种视频.资料以及技术文章. 一.问题 今天有个小伙伴跑过来告诉我有个奇怪的问题需要协助下,问题确实也 ...

  10. HTML+CSS实现大盒子在小盒子的展示范围内进行滚动展示

    HTML+CSS实现大盒子在小盒子的展示范围内进行滚动展示 1.效果展示: 2.主要代码:样式: overflow:auto; 3.如果想要消除对应的滚动条: .out::-webkit-scroll ...