Answers:
每个Java进程都有一个pid
,您首先需要通过jps
命令找到它。
有了pid后,就可以jstat -gc [insert-pid-here]
用来查找垃圾收集堆行为的统计信息。
jstat -gccapacity [insert-pid-here]
将介绍有关内存池生成和空间功能的信息。
jstat -gcutil [insert-pid-here]
将以容量的百分比表示每一代的利用率。有助于快速了解使用情况。
请参阅Oracle网站上的jstat文档。
awk 'print {$3+$4+$6+$8}'
可以在Java 8的jstat列上打印摘要用法
ps -ef | grep java
向我显示了vm args,在我的情况下,该参数包括-Xmx值,这是我所需要的。
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上的Amazon AMI。
尝试在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)。
jstat -gc <vmid>
用于运行应用程序。
晚会晚了,但是一个非常简单的解决方案是使用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
在Java8及更高版本中,您可以使用以下命令:
jcmd JAVA_PROCESS_ID
GC.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
有关jcmd命令的更多详细信息,请访问链接:https ://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
GC.heap_info
在OpenJDK 8中也绝对可用。也许只有最新版本?我正在使用这个:8u191-b12-2ubuntu0.18.04.1
任何方法都应该给您大致相同的数字。分配-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
$ 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
最大值:
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(大约和低于VIRT内存)
最大值(最小值,已使用):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(大致接近RES内存)
“不要在此引用我的信息”,但是VIRT mem大约接近或大于分配的最大内存,但是只要正在使用的内存在物理内存中是可用的/可用的,JVM就不会抛出内存异常。实际上,即使在OS上关闭了交换,在JVM启动时也不会针对物理内存检查最大内存。真正使用由Java程序什么的虚拟内存更好的解释是讨论在这里。
就Java堆大小而言,在Linux中,您可以使用
ps aux | grep java
要么
ps -ef | grep java
并查找-Xms,-Xmx以找出指定的初始堆大小和最大堆大小。
但是,如果您感兴趣的Java进程不存在-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(以字节为单位)。
如果使用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帮助”将其列出。
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上获得有关此内容的更多详细信息
到目前为止,还没有这种工具可以按照您要求的格式打印堆内存 。唯一且唯一的打印方法是借助Runtime Class编写Java程序,
public class TestMemory {
public static void main(String [] args) {
int MB = 1024*1024;
//Getting the runtime reference from system
Runtime runtime = Runtime.getRuntime();
//Print used memory
System.out.println("Used Memory:"
+ (runtime.totalMemory() - runtime.freeMemory()) / MB);
//Print free memory
System.out.println("Free Memory:"
+ runtime.freeMemory() / mb);
//Print total available memory
System.out.println("Total Memory:" + runtime.totalMemory() / MB);
//Print Maximum available memory
System.out.println("Max Memory:" + runtime.maxMemory() / MB);
}
}
参考:https : //viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/
jstat
使用一个选项,以便仅验证JVM的整体内存使用情况?假设您使用Xms=4g
和启动JVM,并且Xmx=4g
想知道已经使用了多少内存?