如何在Linux下通过命令行查看Java应用程序的堆大小(和已使用内存)?

我已经通过jmap试过了。但它提供了信息。关于内部内存区域,如Eden/ PermGen等,这对我来说没什么用。

我想找的是:

最大内存:1GB 最小内存:256mb 堆内存:700mb 已用内存:460mb

这是所有。我知道我可以在JConsole等中看到这一点,但我需要通过命令行来完成。(不能启用JMX等)


当前回答

该命令以字节为单位显示配置的堆大小。

java -XX:+PrintFlagsFinal -version | grep HeapSize

它也适用于Amazon AMI和EC2。

其他回答

有一个具有可视化方面的命令行工具——jvm-mon。它是一个JVM监控工具,用于命令行显示:

堆使用率、大小和最大值 jvm进程 cpu和GC使用率 前线程

在工具打开时,指标和图表会更新。

示例:

该命令以字节为单位显示配置的堆大小。

java -XX:+PrintFlagsFinal -version | grep HeapSize

它也适用于Amazon AMI和EC2。

但一个非常简单的解决方案是使用jpsstat.sh脚本。它提供了一个简单的活电流内存,最大内存和cpu使用细节。

进入GitHub项目,下载jpsstat.sh文件 右键单击jpsstat.sh和权限选项卡,使其可执行 现在执行以下命令。/ jpstat .sh

下面是script -的示例输出

=====  ======  =======  =======  =====
 PID    Name   CurHeap  MaxHeap  %_CPU
=====  ======  =======  =======  =====
2777   Test3      1.26     1.26    5.8
2582   Test1      2.52     2.52    8.3
2562   Test2      2.52     2.52    6.4

任何方法都应该给出大致相同的数字。使用-X分配堆总是一个好主意。m - x . .每代都是X。然后,您可以保证并执行ps来查看传递了哪些参数并因此使用了哪些参数。

对于实际的内存使用,你可以大致比较VIRT(分配和共享)和RES(实际使用)与jstat值的比较:

对于Java 8,请参阅jstat了解这些值的实际含义。假设您运行一个没有mmap或文件处理的简单类。

$ jstat -gccapacity 32277
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
215040.0 3433472.0  73728.0  512.0  512.0  67072.0   430080.0  6867968.0   392704.0   392704.0      0.0 1083392.0  39680.0      0.0 1048576.0   4864.0   7225     2
$ jstat -gcutil 32277
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  6.25   0.00   7.96  18.21  98.01  95.29   7228   30.859     2    0.173   31.032

Max:

     NGCMX + S0C + S1C + EC    + OGCMX   + MCMX    + CCSMX
   3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB

(大致接近和低于VIRT内存)

使用最大值(最小值):

215040 + 512 + 512 + 67072 + 430080  + 39680    +  4864  = ~ 1GB

(大致接近RES内存)

“不要引用我的话”,但VIRT mem大致接近或超过最大内存分配,但只要正在使用的内存在物理内存中是空闲的/可用的,JVM就不会抛出内存异常。事实上,在JVM启动时,即使在操作系统上关闭交换,最大内存也不会与物理内存进行检查。本文将更好地解释Java进程实际使用的虚拟内存。

试试这个吧,它在Ubuntu和RedHat都有效:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

对于Mac

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

所有这些命令的输出类似于下面的输出:

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

要找到以MB为单位的大小,将值除以(1024*1024)。