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

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

我想找的是:

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

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


当前回答

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

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

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

示例:

其他回答

jstat -gccapacity javapid  (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex.  stat -gccapacity 28745 550 10 )

上述命令的O/P示例

NGCMN    NGCMX     NGC     S0C  
87040.0 1397760.0 1327616.0 107520.0 

NGCMN   Minimum new generation capacity (KB).
NGCMX   Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).

更多详情请访问http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

每个Java进程都有一个pid,首先需要使用jps命令找到这个pid。

一旦有了pid,就可以使用jstat -gc [insert-pid-here]来查找垃圾收集堆行为的统计信息。

Jstat -gccapacity [insert-pid-here]将显示有关内存池生成和空间能力的信息。 Jstat -gcutil [insert-pid-here]将显示每代的利用率占其容量的百分比。有用的得到一个一目了然的使用情况。

请参阅Oracle网站上的jstat文档。

就Java堆大小而言,在Linux中可以使用

ps aux | grep java

or

ps -ef | grep java

并查找-Xms, -Xmx以找出指定的初始和最大堆大小。

但是,如果您感兴趣的Java进程中没有-Xms或-Xmx,则意味着您的Java进程正在使用默认的堆大小。您可以使用以下命令来查找默认大小。

java -XX:+PrintFlagsFinal -version | grep HeapSize

或者一个特定的jvm,例如,

/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize

并寻找InitialHeapSize和MaxHeapSize,这是以字节为单位。

试试这个吧,它在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)。

如果不使用大多数工具使用的JMX,您所能做的就是使用

jps -lvm

并推断设置将来自命令行选项。

默认情况下,如果没有JMX,就无法获得动态信息,但是可以编写自己的服务来实现这一点。

顺便说一句:我更喜欢使用VisualVM而不是JConsole。