如何在Linux下通过命令行查看Java应用程序的堆大小(和已使用内存)?
我已经通过jmap试过了。但它提供了信息。关于内部内存区域,如Eden/ PermGen等,这对我来说没什么用。
我想找的是:
最大内存:1GB 最小内存:256mb 堆内存:700mb 已用内存:460mb
这是所有。我知道我可以在JConsole等中看到这一点,但我需要通过命令行来完成。(不能启用JMX等)
如何在Linux下通过命令行查看Java应用程序的堆大小(和已使用内存)?
我已经通过jmap试过了。但它提供了信息。关于内部内存区域,如Eden/ PermGen等,这对我来说没什么用。
我想找的是:
最大内存:1GB 最小内存:256mb 堆内存:700mb 已用内存:460mb
这是所有。我知道我可以在JConsole等中看到这一点,但我需要通过命令行来完成。(不能启用JMX等)
当前回答
有一个具有可视化方面的命令行工具——jvm-mon。它是一个JVM监控工具,用于命令行显示:
堆使用率、大小和最大值 jvm进程 cpu和GC使用率 前线程
在工具打开时,指标和图表会更新。
示例:
其他回答
试试这个吧,它在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)。
如果使用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
在我的情况下,我需要检查一个docker容器内的标志,它没有大多数基本的实用程序(ps, pstree…)
使用jps,我得到了运行的JVM的PID(在我的情况下1),然后用jcmd 1 VM。我从运行的JVM中获得了这些标志。
这取决于您有哪些可用的命令,但这可能会对某些人有所帮助。:)
到目前为止,还没有这样的工具可以按照您要求的格式打印堆内存 打印的唯一方法是在运行时类的帮助下写一个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/
如果不使用大多数工具使用的JMX,您所能做的就是使用
jps -lvm
并推断设置将来自命令行选项。
默认情况下,如果没有JMX,就无法获得动态信息,但是可以编写自己的服务来实现这一点。
顺便说一句:我更喜欢使用VisualVM而不是JConsole。