命令行工具来查找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使用情况
- 顶级线程
指标和图表在工具打开时更新。
样品:
使用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