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

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

我想找的是:

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

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


当前回答

我觉得jmap已经弃用了。我使用以下命令来监控正在运行的java应用程序的堆。正如在答案中从PS -aux(或使用其他方法)获取PID,并使用该命令

jhsdb jmap --heap --pid <PID>

你可以观察到以下细节;

其他回答

首先获取进程id,从下面列出的进程中的第一个数字(或者使用ps aux | grep java,如果你喜欢的话)

jps -lvm

然后在这里使用进程ID:

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

它也适用于Amazon AMI和EC2。

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

jps -lvm

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

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

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

就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,这是以字节为单位。

我觉得jmap已经弃用了。我使用以下命令来监控正在运行的java应用程序的堆。正如在答案中从PS -aux(或使用其他方法)获取PID,并使用该命令

jhsdb jmap --heap --pid <PID>

你可以观察到以下细节;