Command-Line Tools to Find the Java Heap Size – 查找Java堆大小的命令行工具

最后修改: 2020年 7月 25日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this quick tutorial, we’re going to get familiar with a few different ways to get the heap size of a running Java application.

在这个快速教程中,我们将熟悉一些不同的方法来获得运行中的Java程序的堆大小。

2. jcmd

2.jcmd

To find the heap and metaspace related info of a running Java application, we can use the jcmd command-line utility:

为了找到正在运行的Java应用程序的堆和元空间相关信息,我们可以使用jcmd命令行工具

jcmd  GC.heap_info

First, let’s find the process id of a particular Java application using the jps command:

首先,让我们使用jps命令找到一个特定Java应用程序的进程ID。

$ jps -l
73170 org.jetbrains.idea.maven.server.RemoteMavenServer36
4309  quarkus.jar
12070 sun.tools.jps.Jps

As shown above, the process id for our Quarkus application is 4309. Now that we have the process id, let’s see the heap info:

如上所示,我们的Quarkus应用程序的进程ID是4309。现在我们有了进程ID,让我们看看堆的信息。

$ jcmd 4309 GC.heap_info
4309:
 garbage-first heap   total 206848K, used 43061K
  region size 1024K, 43 young (44032K), 3 survivors (3072K)
 Metaspace       used 12983K, capacity 13724K, committed 13824K, reserved 1060864K
  class space    used 1599K, capacity 1740K, committed 1792K, reserved 1048576K

This app is using the G1 or garbage-first GC algorithm:

这个应用程序正在使用G1或垃圾优先GC算法

  • The first line reports the current heap size as 202 MB (206848 K) – also, 42 MB (43061 K) is being used
  • G1 regions are 1 MB, there are 43 regions marked as young, and 3 as survivors space
  • The current capacity of the metaspace is around 13.5 MB (13724 K). From that 13.5 MB, around 12.5 MB (12983 K) is used. Also, we can have up to 1 GB of metaspace (1048576 K). Moreover, 13842 KB guaranteed to be available for use by the Java virtual machine, also known as committed memory
  • The last line shows how much of the metaspace is used to store class information

This output may change depending on the GC algorithm. For instance, if we run the same Quarkus app with ZGC via “-XX:+UnlockExperimentalVMOptions -XX:+UseZGC”:

该输出可能会根据GC算法的不同而改变。例如,如果我们通过“-XX:+UnlockExperimentalVMOptions -XX:+UseZGC”,用ZGC>运行同一个Quarkus应用程序。

ZHeap           used 28M, capacity 200M, max capacity 1024M
Metaspace       used 21031K, capacity 21241K, committed 21504K, reserved 22528K

As shown above, we’re using 28 MB of the heap and around 20 MB of metaspace. As of this writing, Intellij IDEA is still using the CMS GC with the following heap info:

如上所示,我们正在使用28MB的堆和大约20MB的元空间。截至目前,Intellij IDEA仍在使用CMS GC,其堆信息如下。

par new generation   total 613440K, used 114299K
  eden space 545344K,  18% used
  from space 68096K,  16% used
  to   space 68096K,   0% used
 concurrent mark-sweep generation total 1415616K, used 213479K
 Metaspace       used 423107K, capacity 439976K, committed 440416K, reserved 1429504K
  class space    used 55889K, capacity 62488K, committed 62616K, reserved 1048576K

We can spot the classic generational nature of the CMS GC in the heap configuration.

我们可以在堆的配置中发现CMS GC的典型生成性质。

3. jstat

3. jstat

In addition to jcmd, we can use jstat to find out the same information from running applications. For instance, we can use jstat -gc to see heap statistics:

除了jcmd之外,我们还可以使用jstat从运行的应用程序中找出同样的信息。例如,我们可以使用jstat -gc来查看堆的统计数据。

$ jstat -gc 4309
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     
0.0    0.0    0.0    0.0   129024.0  5120.0   75776.0    10134.6   20864.0
MU      CCSC   CCSU     YGC     YGCT    FGC    FGCT     CGC    CGCT     GCTGCT
19946.2 2688.0 2355.0    2      0.007    1      0.020    0     0.000     0.027

Each column represents the memory capacity or utilization of a specific memory area:

每一列代表内存容量或特定内存区域的利用率。

  • S0C — The capacity for the first survivor space
  • S1C — The capacity for the second survivor space
  • S0U — The used space of the first survivor
  • S1U — The used space of the second survivor
  • EC — Eden space capacity
  • EU — Used space from Eden
  • OC — Old generation capacity
  • OU — Used space from Old generation
  • MC — Metaspace capacity
  • MU — Used space from Metaspace
  • CCSC — Compressed class space capacity
  • CCSU — Used space for compressed classes
  • YGC — The number of minor GCs
  • YGCT — The time spent for minor GCs
  • FGC — The number of full GCs
  • FGCT — The time spent for full GCs
  • CGC — The number of concurrent GCs
  • CGCT — Time spent on concurrent GCs
  • GCT — The time spent for all GCs

There are other memory-related options for jstat such as:

jstat还有其他与内存有关的选项,例如。

  • The -gccapacity to report different capacities for different memory regions
  • The -gcutil only shows the utilization percentage of each region
  • The -gccause is the same as -gcutil but adds the cause of the last GC and possibly current GC events

4. Command-Line Args

4.命令行参数

If we run a Java application with heap configuration options (for example, -Xms and -Xmx), then there a few other tricks to find the specified values.

如果我们运行一个带有堆配置选项的Java应用程序(例如,-Xms-Xmx),那么还有一些其他技巧可以找到指定的值。

For instance, here’s how jps reports those values:

例如,这里是jps报告这些数值的方式。

$ jps -lv
4309 quarkus.jar -Xms200m -Xmx1g

With this approach, we can only find these static values. So, there is no way to know about, say, the current committed memory.

使用这种方法,我们只能找到这些静态值。因此,我们没有办法知道,比如说,当前投入的内存

In addition to jps, a few other tools will report the same thing. For example, the “jcmd <pid> VM.command_line” will also report these details:

除了jps之外,其他一些工具也会报告同样的事情。例如,“jcmd <pid> VM.command_line” 也将报告这些细节。

$ jcmd 4309 VM.command_line
4309:
VM Arguments:
jvm_args: -Xms200m -Xmx1g
java_command: quarkus.jar
java_class_path (initial): quarkus.jar
Launcher Type: SUN_STANDARD

Also, on most Unix-based systems we can use ps from the procps package:

此外,在大多数基于Unix的系统中,我们可以使用ps,来自procps包。

$ ps -ef | grep quarkus
... java -Xms200m -Xmx1g -jar quarkus.jar

Finally, on Linux, we can use the /proc virtual filesystem and its pid-files:

最后,在Linux上,我们可以使用/proc虚拟文件系统和它的pid文件。

$ cat /proc/4309/cmdline
java -Xms200m -Xmx1g -jar quarkus.jar

The cmdline file, in a directory named after the Quarkus pid, contains the command-line entry for the application.

cmdline文件,在以Quarkus pid命名的目录下,包含了应用程序的命令行条目。

5. Conclusion

5.总结

In this quick tutorial, we saw a few different ways to get the heap size of a running Java application.

在这个快速教程中,我们看到了一些不同的方法来获得一个正在运行的Java应用程序的堆大小。