“工欲善其事必先利其器”。

一、命令行工具

1. jps

JVM Process Status Tool,显示虚拟机进程。这个命令的使用频率很高,当服务器上运行大量Java项目的时候,系统管理员会通过该命令来查看对应的进程是否启动。

用法jps [-q] [-mlvV]

参数说明

  • -q:打印进程号
  • -l:打印启动类的全限定名
  • -m:打印启动类的 main 方法入参
  • -v:打印指定的虚拟机参数
  • -V:打印类名

例子jpsjps -l

2、jstat

JVM statistics Monitoring,对Java虚拟机内存进行监控统计,包括类装载、内存、垃圾收集、JIT编译信息等。该命令通常与jps命令一起使用,先通过jps查看当前服务器上运行有哪些进程,获取到对应的进程号后再使用jstat来查看该进程的具体信息。

用法jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数说明

  • option:操作,参数比较多,常用的是gcutil,统计垃圾回收情况。

    • -class:监控类装载,卸载数量,总空间以及消费的时间
    • -gc:垃圾回收堆的行为统计(常用命令)
    • -gccapacity:同-gc,同时还会输出JAVA堆各区域的使用到的最大、最小空间
    • -gcutil:同-gc,输出的是已使用空间占总空间的百分比
    • -gccause:在-gcutil的基础上附加最近两次垃圾回收时间的原因
  • -t:显示时间戳列
  • -h:指定多少行显示标题
  • -vmid:进程ID
  • -interval:每行输出的时间间隔
  • -count:指定输出行数

例子jstat -gcutil -h2 -t 11904 100 5,表示监控进程号11904的垃圾收集统计值,每隔100ms输出一行,总共输出5次,每输出2次需要重新输出标题。

D:\>jstat -gcutil -h2 -t 11904 100 5
Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT1252.1   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.0071252.2   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT1252.3   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.0071252.5   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT1252.6   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007

输出的指标说明

  • S0:survivor 0 已用空间占比
  • S1:survivor 1 已用空间占比
  • E:Eden 区已用空间占比
  • O:老年代已用空间占比
  • M:元数据已用空间占比
  • CCS:压缩类空间占比
  • YGC:Minor GC 次数
  • YGCT:Minor GC 消耗时间
  • FGC:Full GC 次数
  • FGCT:Full GC 消耗时间
  • GCT:垃圾回收消耗总时间

元空间M就是永久代的替代产物。

3. jinfo

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

用法jinfo [option] <pid>

参数说明

  • option:操作

-flag 打印指定的VM参数的值
-flag [+|-] 启用或禁用指定的VM参数
-flag = 修改VM参数
-flags 打印VM参数
-sysprops 打印Java系统配置

  • pid:进程ID

例子

#查看指定的进程是否使用了G1垃圾回收器
D:\>jinfo -flag UseG1GC 11904
-XX:-UseG1GC

4. jmap

JVM Memory Map,用来生成堆栈dump文件。可查看的信息如下:

  • 查看堆各个对象的数量,大小
  • dump堆里的对象信息,然后可以用MAT分析
  • 查看堆的配置情况和GC算法
  • 查看堆永久代信息

用法jmap [option] <pid>

参数说明

  • option:操作

heap:打印Java堆摘要
histo[:live]:打印java对象堆的直方图; 如果指定了“live”选项,则仅计算实时对象
dump:生成dump快照

  • pid:进程ID

例子

jmap -heap 15754
jmap -histo:live 15754
jmap -dump:live,file=.\heap_dump.hprof 15754

5. jstack

用来生成Java虚拟机当前时刻的线程快照,方便定位线程长时间停顿的问题,比如死锁、死循环、长时间等待等。

用法jstack -F [-m] [-l] <pid>

参数说明

  • -F:强制打印堆栈
  • -m:同时打印Java和本地方法的堆栈
  • -l:打印关于锁的附件信息
  • pid:进程ID

例子

D:\>jstack -l 11904
2020-04-03 15:54:36
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode):"RMI TCP Connection(idle)" #36 daemon prio=5 os_prio=0 tid=0x000000001a27a000 nid=0x3bd0 waiting on condition [0x000000001c3ee000]java.lang.Thread.State: TIMED_WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000000d0687c48> (a java.util.concurrent.SynchronousQueue$TransferStack)at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Locked ownable synchronizers:- None

这个打印的信息跟我们在Java代码中使用Thread.getAllStackTraces()方法获取的内容是一致的。

6. jhat

JVM Heap Analysis Tool,用来分析jmap生成的堆栈日志,生成HTML文件。jhat命令对于内存和cpu的占用率非常高,通常不会在服务器上直接进行分析,而是拷贝到本地再进行分析。该命令执行完毕后会启动一个简易的HTTP服务,端口号是7000,本地可以通过http://localhost:7000访问,生成的html页面如下所示:

查看堆异常主要关注两个:

  • Show instance counts for all classes (excluding platform) 平台外的所有对象信息
  • Show heap histogram 先是堆的统计信息

这个命令功能非常强大,但使用率不是很高,我们一般会用可视化工具来分析堆栈日志,比如MAT。

7. jcmd

JDK建议使用 jcmd 替代 jstack、jinfo、jmap 等命令。

例子

  • jcmd -l:列出所有Java虚拟机。
  • jcmd 15754 help:列出该虚拟机支持的命令。
  • jcmd 15754 PerfCounter.print:获取所有性能相关的数据。
  • jcmd 15754 GC.class_histogram

二、可视化工具

jconsole:JDK自带监控工具:内存监控、线程监控、检测死锁

jvisualvm:JDK自带监控工具,比jconsole显示更多监控数据

jmc:也是JDK自带监控工具,比jvisualvm显示更多监控数据

MAT:Memory Analyzer Tool,Java虚拟机内存分析工具,能够快速的分析dump日志。

官网下载地址:https://www.eclipse.org/mat/

三、虚拟机工具思维导图

参考资料:

  1. https://www.cnblogs.com/bigshark/p/11253590.html

Java虚拟机-常用工具相关推荐

  1. java虚拟机常用命令工具

    java虚拟机常用命令工具 博客分类: 虚拟机 虚拟机jvmjava  一.概述            程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统日志.堆dump文件.线程d ...

  2. 深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中- 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别J ...

  3. Java虚拟机常用命令

    1. 常见使用流程 先用jps查看当前在运行的java虚拟机: 然后用jinfo和jstat查看某台虚拟机的参数和运行状态: 如果要继续深入查看程序的运行状态,则需要使用jstack和jmap查看程序 ...

  4. java 操作vss,java开发常用工具总结,java开发常用工具

    java开发常用工具总结,java开发常用工具 1.editplus editplus 是我使用最频繁的工具,不管是java程序还是其他的语言的程序,本人都使用它,方便好用,速度快.如果配置好的话,可 ...

  5. Java程序常用工具

    添加网址超链接后,博客无法发布,会出现以下问题: 因此,本文的所有网址都取消了超链接,同时将网址协议的"http://"也给取消了,如果无法访问,添加上该协议即可. Java7的所 ...

  6. java虚拟机出现问题解决,java虚拟机故障处理工具

    概述 给系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段. java开发人员可以在jdk安装的bin目录下找到除了java,javac以外的其他命令.这些命令主要是一 ...

  7. Java虚拟机常用的性能监控工具

    基础故障处理工具 jps: 虚拟机进程状况工具 功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID. 它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到 ...

  8. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  9. java开发常用工具、github加速工具、idea插件

    java常用工具 开源终端工具:Tabby 非开源的终端工具:xshell 开源数据库连接工具:DBeaver 开发工具:idea 社区版 文本工具:notepad++ 脑图:xmind 在线脑图:p ...

最新文章

  1. Linux0.11 创建进程的过程分析--fork函数的使用
  2. Python基础-re模块
  3. Linux 下 离线下载服务部署 CCAA的安装使用
  4. git 版本控制器 初学习,工作中的问题及其解决方法
  5. 简单的IDT HOOK介绍
  6. JS中的异步任务有哪些
  7. 华为(英国)招聘CPU/GPU架构及系统软件工程师
  8. mdx格式的词典用什么软件打开_可能是目前PC端最好用的词典——Goldendict
  9. python前端用什么架构_Python web世界观——web架构概览(适合传统软件工程师)...
  10. Intellij mac快捷键
  11. svn切换项目地址(外网 > 内网)
  12. 主引导记录(MBR)分析
  13. Xposed 模块编写
  14. python怎么读?如何正确的发音?
  15. Selenium IDE安装与运行
  16. java 为什么双亲委派_双亲委派机制及使用原因是什么?
  17. SQL 里ESCAPE的用法
  18. matlab surf 坐标设置,matlab中3D曲面函数surf的坐标问题
  19. jQuery动画练习
  20. JAVA基础常见的知识点

热门文章

  1. 真正中文攻略之ef - the first tale(含下载和汉化)
  2. where、having、group by、order by、limit的区别和使用顺序
  3. Zookeepr 如何进行权限控制?
  4. FileOutputStream 类 和 FileInputStream类的简单介绍,附代码演示。以及一个复制媒体文件的小程序。
  5. Spark OpenHashMap分析
  6. hibernate中antlr对于hql与sql的转换源码的一些细节
  7. 三天打鱼两天晒网python程序设计_Python经常会遇到三天的笔试题:钓鱼和两天的晒网:,之,三天打鱼,两天晒网...
  8. Java高并发编程详解系列-线程安全数据同步
  9. 云计算中的Iaas,Paas和Saas
  10. new一个对象的过程中发生了什么