命令行工具来查找Java堆大小和使用的内存(Linux)?

是否有命令行工具(Linux)检查Java应用程序的堆大小(和已用内存)?

我试过jmap。 但它给信息。 关于像Eden / PermGen等内部记忆区域,这对我没有用处。

我正在寻找像这样的东西:
最大内存:1GB
最小内存:256 MB
堆内存:700 MB
使用的内存:460 MB

就这样。 我知道我可以看到这在JConsole等,但我需要一个命令行工具(不能启用JMX等)

任何这样的工具/命令?

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

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

  • jstat -gccapacity [insert-pid-here]将提供有关内存池生成和空间function的信息。

  • jstat -gcutil [insert-pid-here]会将每一代的利用率作为其容量的百分比。 有用于一目了然地查看使用情况。

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

jvmtop是一个命令行工具,它提供了包括堆在内的多个指标的实时视图。

虚拟机概览模式的输出示例:

  JvmTop 0.3 alpha (expect bugs) amd64 8 cpus, Linux 2.6.32-27, load avg 0.12 http://code.google.com/p/jvmtop PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL 3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21 11272 ver.resin.Resin [ERROR: Could not attach to VM] 27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31 19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20 16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46 
 java -XX:+PrintFlagsFinal -version | grep HeapSize 

在ec2上工作亚马逊ami也是如此

如果不使用大多数工具使用的JMX,则只能使用

 jps -lvm 

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

默认情况下,您不能获取dynamic信息,但是您可以编写自己的服务来执行此操作。

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

试试这个工作在Ubuntu和红帽:

 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版本“1.7.0_05”Java™SE运行时环境(版本1.7.0_05-b05)Java HotSpot™64位服务器虚拟机(构build23.1-b03,混合模式)

要查找以MB为单位的大小,请用(1024 * 1024)

有一个视觉方面的命令行工具 – jvm-mon 。 这是一个用于命令行的JVM监视工具,它使Disaply:

  • 堆使用率,大小和最大
  • jvm进程
  • CPU和GC使用情况
  • 顶级线程

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

样品: JVM-MON

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

对于我的情况,我有一个10g的文件读取在Java中,每次我得到的内存exception。 当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

 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堆大小而言,在Linux中,可以使用

 ps aux | grep java 

要么

 ps -ef | grep java 

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

但是,如果您感兴趣的Java进程缺less-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。

晚会晚了,但一个非常简单的解决scheme是使用jpsstat.sh脚本。 它提供了一个简单的活动当前内存最大内存CPU使用细节。

  • 转到GitHub项目并下载jpsstat.sh文件
  • 右键单击jpsstat.sh并select权限选项卡并使其可执行
  • 现在使用以下命令运行脚本./jpsstat.sh

这里是脚本的示例输出 –

 ===== ====== ======= ======= ===== 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 

首先从以下列表中的一个获得进程ID(来自进程列表中的第一个数字):(或者只是使用ps aux | grep java ,如果您愿意的话)

 jps -lvm 

然后在这里使用进程ID:

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