是否有命令行工具(Linux)来检查Java应用程序的堆大小(和已用内存)?
我试过jmap。但它提供了信息。关于内部记忆区域,如Eden / PermGen等,这对我没用。
我正在寻找类似的东西:
最大内存:1GB
最小内存:256 MB
堆内存:700 MB
使用的内存:460 MB
多数民众赞成。我知道我可以在JConsole等中看到这个,但我需要一个命令行工具(不能启用JMX等)。
任何此类工具/命令?
答案 0 :(得分:126)
每个Java进程都有pid
,您首先需要使用jps
命令找到它。
获得pid后,可以使用jstat -gc [insert-pid-here]
查找垃圾收集堆行为的统计信息。
jstat -gccapacity [insert-pid-here]
将提供有关内存池生成和空间功能的信息。
jstat -gcutil [insert-pid-here]
会将每一代的利用率作为其容量的百分比。有助于快速了解使用情况。
请参阅Oracle网站上的jstat docs。
答案 1 :(得分:60)
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
答案 2 :(得分:51)
此命令显示已配置的堆大小(以字节为单位)。
java -XX:+PrintFlagsFinal -version | grep HeapSize
它也适用于EC2上的Amazon AMI。
答案 3 :(得分:31)
试试这个在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)。
答案 4 :(得分:23)
不使用大多数工具使用的JMX,您只能使用
jps -lvm
并推断设置将来自命令行选项。
默认情况下,您无法在没有JMX的情况下获取动态信息,但您可以编写自己的服务来执行此操作。
BTW:我更喜欢使用VisualVM而不是JConsole。
答案 5 :(得分:16)
有一个带有视觉方面的命令行工具 - jvm-mon。它是一个用于命令行的JVM监视工具,它消失了:
工具打开时,指标和图表会更新。
答案 6 :(得分:6)
晚会,但一个非常简单的解决方案是使用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
答案 7 :(得分:5)
就我而言,我需要检查没有大多数基本实用程序(ps,pstree ...)的docker容器内的标志
使用jps
我得到了正在运行的JVM的PID(在我的情况下为1),然后使用jcmd 1 VM.flags
我得到了正在运行的JVM的标志。
这取决于您可用的命令,但这可能会对某人有所帮助。 :)
答案 8 :(得分:4)
任何方法都应该给你大致相同的数字。对于所有代,使用-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内存大致接近或超过分配的最大内存,但只要使用的内存在物理内存中是空闲/可用的,JVM就不会抛出内存异常。事实上,即使在操作系统上关闭了交换机,JVM启动时也不会根据物理内存检查最大内存。更详细地讨论了Java进程真正使用的虚拟内存here。
答案 9 :(得分:3)
在 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
答案 10 :(得分:2)
首先从下列其中一项获取进程ID,即列出的进程中的第一个数字:(或者只使用ps aux | grep java
,如果您愿意的话)
jps -lvm
然后在此处使用进程ID:
jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
答案 11 :(得分:2)
要查找正在运行的 Java 应用程序的堆和元空间相关信息,我们可以使用 jcmd 命令行实用程序:
jcmd GC.heap_info
首先,让我们使用 jps 命令查找特定 Java 应用程序的进程 ID:
$ jps -l
73170 org.jetbrains.idea.maven.server.RemoteMavenServer36
4309 quarkus.jar
如上所示,我们的 Quarkus 应用程序的进程 id 是 4309。现在我们有了进程 id,让我们看看堆信息:
$ jcmd 4309 GC.heap_info
4309:
garbage-first heap total 206848K, used 43061K
region size 1024K, 43 young (44032K), 3 survivors (3072K)
Metaspace used 12983K, capacity 13724K, committed 13824K, reserved 1060864K
class space used 1599K, capacity 1740K, committed 1792K, reserved 1048576K
12070 sun.tools.jps.Jps
希望有帮助:)
答案 12 :(得分:1)
使用top
命令是检查程序内存使用情况的最简单方法。 RES
列显示进程占用的实际物理内存。
对于我的情况,我在java中读取了10g文件,并且每次出现outOfMemory异常。当RES
列中的值达到-Xmx
选项中设置的值时,就会发生这种情况。然后通过使用-Xmx
选项增加内存,一切都很顺利。
答案 13 :(得分:1)
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
了解详情答案 14 :(得分:1)
就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,以字节为单位。
答案 15 :(得分:1)
如果使用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,请使用&#34; jrcmd help&#34;列出它们。
https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
答案 16 :(得分:1)
到目前为止,尚无此类工具以您要求的格式打印堆内存 唯一且唯一的打印方法是在运行时类的帮助下编写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/
答案 17 :(得分:1)