如何在Linux下通过命令行查看Java应用程序的堆大小(和已使用内存)?
我已经通过jmap试过了。但它提供了信息。关于内部内存区域,如Eden/ PermGen等,这对我来说没什么用。
我想找的是:
最大内存:1GB 最小内存:256mb 堆内存:700mb 已用内存:460mb
这是所有。我知道我可以在JConsole等中看到这一点,但我需要通过命令行来完成。(不能启用JMX等)
如何在Linux下通过命令行查看Java应用程序的堆大小(和已使用内存)?
我已经通过jmap试过了。但它提供了信息。关于内部内存区域,如Eden/ PermGen等,这对我来说没什么用。
我想找的是:
最大内存:1GB 最小内存:256mb 堆内存:700mb 已用内存:460mb
这是所有。我知道我可以在JConsole等中看到这一点,但我需要通过命令行来完成。(不能启用JMX等)
当前回答
该命令以字节为单位显示配置的堆大小。
java -XX:+PrintFlagsFinal -version | grep HeapSize
它也适用于Amazon AMI和EC2。
其他回答
从顶部找到你的webapp/java进程的进程id。 使用jmap heap获取堆分配。我在AWS-Ec2上测试了弹性豆茎
你可以在图片下面看到3GB的最大堆应用程序
我觉得jmap已经弃用了。我使用以下命令来监控正在运行的java应用程序的堆。正如在答案中从PS -aux(或使用其他方法)获取PID,并使用该命令
jhsdb jmap --heap --pid <PID>
你可以观察到以下细节;
使用top命令是检查程序内存使用情况的最简单方法。RES列显示进程占用的实际物理内存。
对于我的情况,我有一个10g的文件在java中读取,每次我得到outOfMemory异常。当RES列中的值达到-Xmx选项中设置的值时,就会发生这种情况。然后使用-Xmx选项增加内存,一切正常。
如果使用jrockit,请尝试jrcmd命令行工具。例如:
$ jrcmd 5127 print_memusage
5127:
Total mapped 1074596KB (reserved=3728KB)
- Java heap 786432KB (reserved=0KB)
- GC tables 26316KB
- Thread stacks 13452KB (#threads=34)
- Compiled code 9856KB (used=9761KB)
- Internal 840KB
- OS 15036KB
- Other 146632KB
- Java class data 75008KB (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking 1024KB (malloced=102KB #8)
对于更多命令,如heap_diagnostics,使用“jrcmd help”列出它们。
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
该命令以字节为单位显示配置的堆大小。
java -XX:+PrintFlagsFinal -version | grep HeapSize
它也适用于Amazon AMI和EC2。