Java虚拟机(JVM)的自带工具使用详解

 更新时间:2026年01月08日 16:51:53   作者:jpq+  
文章介绍了Java开发中常用的几个工具及其基本用法,包括jps、jstat、jinfo、jmap、jhat和jstack,这些工具帮助开发者监控和分析Java应用程序的性能和内存使用情况,对于排查问题和优化性能非常有帮助

jps

JVM进程状态工具,用于查看进程的基本信息。JPS是Java Virtual Machine Process Status Tool的缩写,它是Java提供的一个用于查看所有Java进程的命令行工具。

  • jps: 默认情况下,不带任何参数运行jps将显示所有正在运行的Java进程的PID和主类名。
  • jps -l: 使用-l选项可以显示完整的包名和类名
  • jps -m: 使用-m选项可以显示传递给Java进程的启动参数。
  • jps -v: 使用-v选项可以显示传递给Java进程的完整命令行参数

jstat 的各种命令

jstat 是JVM统计监控工具,用于查看堆、GC(垃圾回收)等详细信息。

jstat -gc : 显示垃圾收集统计信息,包括新生代、老年代、永久代等区域的使用情况和垃圾回收次数。

以下是 jstat -gc 命令的一般用法:

jstat -gc <pid> [interval] [count]

其中, 是目标Java进程的进程ID,[interval] 是采样间隔(以毫秒为单位),[count] 是要显示的样本数量。如果不指定 [interval] 和 [count],则默认情况下会持续输出垃圾收集统计信息,直到手动停止。

例如,要查看进程ID为12345的Java虚拟机的垃圾收集统计信息,每隔1000毫秒(1秒)采样一次,共采样10次,可以运行以下命令:

jstat -gc 12345 1000 10

这将输出类似以下格式的数据:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   512.0    0.0    0.0   4096.0   4096.0     8192.0     8192.0   1024.0  768.0  2048.0 2048.0    10    0.123   2      0.045   0.168

每一列的含义如下:

  • S0C: Survivor 0区的容量(字节)
  • S1C: Survivor 1区的容量(字节)
  • S0U: Survivor 0区已使用的空间(字节)
  • S1U: Survivor 1区已使用的空间(字节)
  • EC: Eden区的容量(字节)
  • EU: Eden区已使用的空间(字节)
  • OC: Old区的容量(字节)
  • OU: Old区已使用的空间(字节)
  • MC: Metaspace区的容量(字节)
  • MU: Metaspace区已使用的空间(字节)
  • CCSC: Compressed Class Space区的容量(字节)
  • CCSU: Compressed Class Space区已使用的空间(字节)
  • YGC: 年轻代垃圾回收次数
  • YGCT: 年轻代垃圾回收总耗时(秒)
  • FGC: Full GC次数
  • FGCT: Full GC总耗时(秒)
  • GCT: 垃圾回收总耗时(秒)

jstat中的其他命令:

  • jstat -gccapacity : 显示各个内存区域的容量。
  • jstat -gcutil : 显示垃圾收集统计信息的百分比形式,更直观地展示内存区域使用情况。
  • jstat -gccause : 显示最后一次垃圾回收的原因。
  • jstat -gcnew : 显示新生代的垃圾收集统计信息。
  • jstat -gcold : 显示老年代的垃圾收集统计信息。
  • jstat -gcpermcapacity : 显示永久代的容量。
  • jstat -compiler : 显示即时编译器的编译统计信息。
  • jstat -printcompilation : 显示即时编译器的编译请求和编译耗时。

jinfo

Java配置信息工具,可以查看配置参数信息,还支持部分参数的运行时修改。

使用jinfo命令查看Java应用程序的运行时属性,可以输入以下命令,其中 pid是Java应用程序的进程ID 并输出对应名称的参数:

jinfo  -flag name  <pid>

jmap

Java内存映射工具,用于分析堆内存,还能够dump堆内存快照。

jmap -histo 23173

该命令将会显示进程ID为23173的Java进程的堆内存中各个对象的数量和占用的内存大小。

这个命令可以帮助开发者了解当前Java进程的内存使用情况,从而找出潜在的内存泄漏或者优化内存使用。

jhat

Java堆分析工具,用于解析堆内存的dump文件。当使用jmap或其他方法生成Java的堆文件后,可以使用jhat进行分析。

运行jhat命令后,它会解析堆转储文件并启动一个Web服务器,用户可以通过浏览器访问并查看堆的情况。

在HTML页面上,jhat提供了多种功能,如显示所有类包括平台类、从根集能引用到的对象、显示每个类的实例数量、堆实例的分布表以及执行对象查询语句等。

jhat一般与jmap搭配使用,用于分析jmap生成的堆转储快照。

jstack

Java堆栈跟踪工具,用于查看Java程序的堆栈信息,可以用来分析线程问题(如死锁)。

jstat提供了多种命令选项,可以详细查看堆内存各部分的使用量以及加载类的数量。

例如,使用jstat -class可以查看类加载统计信息,包括加载类的数量、所占用的空间大小以及未加载类的数量和所占用的空间。

jstat -class 23173
#显示如下:
Loaded  Bytes  Unloaded  Bytes     Time   
 19595 40567.9       10    10.3       8.20

jstat -compiler则用于显示JIT编译器的编译统计信息,包括编译数量、失败数量等。

jstat还可以用于监控垃圾回收情况。

例如:

使用jstat -gc可以查看年轻代和老年代的垃圾回收次数、回收消耗时间以及堆内存的使用情况。

通过这些统计信息,开发者可以了解JVM中垃圾回收器的行为,从而优化应用程序的性能。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java项目导出为.exe执行文件的方法步骤

    java项目导出为.exe执行文件的方法步骤

    最近做了个项目,想要转换成可执行文件,那么java项目如何导出为.exe执行文件,本文就介绍一下,主要使用jar2exe软件,感兴趣的可以了解一下
    2021-05-05
  • Mybatis如何通过注解开启使用二级缓存

    Mybatis如何通过注解开启使用二级缓存

    这篇文章主要介绍了Mybatis基于注解开启使用二级缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 利用spring AOP记录用户操作日志的方法示例

    利用spring AOP记录用户操作日志的方法示例

    这篇文章主要给大家介绍了关于利用spring AOP记录用户操作日志的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • Servlet映射路径匹配解析详解

    Servlet映射路径匹配解析详解

    servlet是javaweb用来处理请求和响应的重要对象,本文将从源码的角度分析tomcat内部是如何根据请求路径匹配得到处理请求的servlet的,感兴趣的可以了解一下
    2022-08-08
  • Mybatis sql与xml文件读取方法详细分析

    Mybatis sql与xml文件读取方法详细分析

    这篇文章主要介绍了Mybatis sql与xml文件读取方法,在执行一个自定义sql语句时,dao对应的代理对象时如何找到sql,也就是dao的代理对象和sql之间的关联关系是如何建立的
    2023-01-01
  • java程序员如何编写更好的单元测试的7个技巧

    java程序员如何编写更好的单元测试的7个技巧

    测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机。本文主要介绍java程序员编写更好的单元测试的7个技巧。下面跟着小编一起来看下吧
    2017-03-03
  • Java中controller层如何接收带参数的查询

    Java中controller层如何接收带参数的查询

    本文主要介绍了Java中controller层如何接收带参数的查询,在控制器层接收带参数的查询可以通过多种方式实现,下面就详细的介绍一下,感兴趣的可以了解一下
    2023-08-08
  • Java中Thread类的使用和它的属性

    Java中Thread类的使用和它的属性

    在java中可以进行多线程编程,在java标准库中提供了一个Thread类,来表示线程操作,本文主要介绍了Java中Thread类的使用和它的属性,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java中的泛型和泛型通配符详解

    Java中的泛型和泛型通配符详解

    这篇文章主要介绍了Java中的泛型和泛型通配符详解,泛型的作用就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,需要的朋友可以参考下
    2023-07-07
  • MyBatis在Spring环境下的事务管理

    MyBatis在Spring环境下的事务管理

    MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能。这篇文章主要介绍了MyBatis在Spring环境下的事务管理 ,需要的朋友可以参考下
    2019-07-07

最新评论