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

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

我想找的是:

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

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


当前回答

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

它也适用于Amazon AMI和EC2。

其他回答

使用top命令是检查程序内存使用情况的最简单方法。RES列显示进程占用的实际物理内存。

对于我的情况,我有一个10g的文件在java中读取,每次我得到outOfMemory异常。当RES列中的值达到-Xmx选项中设置的值时,就会发生这种情况。然后使用-Xmx选项增加内存,一切正常。

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

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

jhsdb jmap --heap --pid <PID>

你可以观察到以下细节;

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

jps -lvm

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

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

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

从顶部找到你的webapp/java进程的进程id。 使用jmap heap获取堆分配。我在AWS-Ec2上测试了弹性豆茎

你可以在图片下面看到3GB的最大堆应用程序