Jas*_*per 154 java linux memory heap performance
是否有一个命令行工具(Linux)来检查Java应用程序的堆大小(和使用的内存)?
我试过jmap.但它提供了信息.关于内部记忆区域,如Eden/PermGen等,这对我没用.
我正在寻找类似的东西:
最大内存:1GB
最小内存:256 MB
堆内存:700 MB已
用内存:460 MB
就这样.我知道我可以在JConsole等中看到这个,但我需要一个命令行工具(不能启用JMX等)
任何这样的工具/命令?
far*_*992 140
每个Java进程都有一个pid,您首先需要使用该jps命令找到它.
获得pid后,您可以使用jstat -gc [insert-pid-here]查找垃圾收集堆行为的统计信息.
jstat -gccapacity [insert-pid-here] 将提供有关内存池生成和空间功能的信息.
jstat -gcutil [insert-pid-here]将把每一代的利用率作为其能力的百分比.有助于快速了解使用情况.
请参阅Oracle网站上的jstat文档.
MRa*_*ser 61
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
Run Code Online (Sandbox Code Playgroud)
Atm*_*tma 57
此命令显示配置的堆大小(以字节为单位).
java -XX:+PrintFlagsFinal -version | grep HeapSize
Run Code Online (Sandbox Code Playgroud)
它也适用于EC2上的Amazon AMI.
pad*_*ist 37
试试这个在Ubuntu和RedHat中工作:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Run Code Online (Sandbox Code Playgroud)
对于Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Run Code Online (Sandbox Code Playgroud)
对于Mac
java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
Run Code Online (Sandbox Code Playgroud)
所有这些命令的输出类似于下面的输出:
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)
Run Code Online (Sandbox Code Playgroud)
要以MB为单位查找大小,请将值除以(1024*1024).
Pet*_*rey 24
不使用大多数工具使用的JMX,您所能做的就是使用
jps -lvm
Run Code Online (Sandbox Code Playgroud)
并推断设置将来自命令行选项.
默认情况下,如果没有JMX,您将无法获取动态信息,但您可以编写自己的服务来执行此操作.
顺便说一句:我更喜欢使用VisualVM而不是JConsole.
vai*_*pta 18
从Java8 及更高版本,您可以使用以下命令:
jcmd JAVA_PROCESS_IDGC.heap_info
您可以参考输出中的总和、总内存和已用内存。
Sample Command And Output: jcmd 9758 GC.heap_info
PSYoungGen total 1579520K, used 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
to space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
class space used 1823K, capacity 1936K, committed 2048K, reserved 1048576K
Run Code Online (Sandbox Code Playgroud)
有关 jcmd 命令的更多详细信息,请访问此处的链接
fro*_*tin 11
在我的情况下,我需要检查没有大多数基本实用程序(ps、pstree ...)的 docker 容器内的标志
使用jps我得到了正在运行的 JVM 的 PID(在我的情况 1 中),然后jcmd 1 VM.flags我从正在运行的 JVM 中得到了标志。
这取决于您可以使用哪些命令,但这可能会对某人有所帮助。:)
晚会,但一个非常简单的解决方案是使用jpsstat.sh脚本.它提供简单的实时当前内存,最大内存和CPU使用细节.
这是脚本的示例输出 -
===== ====== ======= ======= =====
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
Run Code Online (Sandbox Code Playgroud)
就Java堆大小而言,在Linux中,可以使用
ps aux | grep java
Run Code Online (Sandbox Code Playgroud)
或者
ps -ef | grep java
Run Code Online (Sandbox Code Playgroud)
并查找 -Xms、-Xmx 以找出指定的初始堆大小和最大堆大小。
但是,如果您感兴趣的 Java 进程缺少 -Xms 或 -Xmx,则意味着您的 Java 进程正在使用默认堆大小。您可以使用以下命令来查找默认大小。
java -XX:+PrintFlagsFinal -version | grep HeapSize
Run Code Online (Sandbox Code Playgroud)
或特定的 jvm,例如,
/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize
Run Code Online (Sandbox Code Playgroud)
并查找 InitialHeapSize 和 MaxHeapSize(以字节为单位)。
首先从以下之一获取进程 ID,即列出的进程中的第一个数字:(或者仅使用ps aux | grep java,如果您愿意的话)
jps -lvm
Run Code Online (Sandbox Code Playgroud)
然后在此处使用进程 ID:
jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
Run Code Online (Sandbox Code Playgroud)
任何方法都应该给您大致相同的数字。分配-X..m -X..x所有代使用的堆总是一个好主意。然后,您可以保证也可以执行ps来查看已传递并因此使用了哪些参数。
对于实际的内存使用情况,您还可以大致比较VIRT(已分配和共享)和RES(实际使用)与jstat值进行比较:
对于Java 8,请参阅jstat了解这些值的实际含义。假设您运行一个没有mmap或文件处理的简单类。
$ jstat -gccapacity 32277
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2
Run Code Online (Sandbox Code Playgroud)
$ jstat -gcutil 32277
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032
Run Code Online (Sandbox Code Playgroud)
最大值:
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
Run Code Online (Sandbox Code Playgroud)
(大约和低于VIRT内存)
最大(最小,已用):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
Run Code Online (Sandbox Code Playgroud)
(大致接近RES内存)
“不要在此引用我的信息”,但是VIRT mem大约接近或大于分配的最大内存,但是只要正在使用的内存在物理内存中是可用的/可用的,JVM就不会抛出内存异常。实际上,即使在OS上关闭了交换,在JVM启动时也不会针对物理内存检查最大内存。真正使用由Java程序什么的虚拟内存更好的解释是讨论在这里。
从顶部找到您的 webapp/java 进程的进程 ID。使用 jmap heap 获取堆分配。我在 AWS-Ec2 上针对弹性豆茎进行了测试
您可以在下图中看到该应用程序的最大堆为 3GB