用于查找Java堆大小和内存的命令行工具(Linux)?

时间:2012-10-09 10:03:10

标签: java linux memory heap

是否有命令行工具(Linux)来检查Java应用程序的堆大小(和已用内存)?

我试过jmap。但它提供了信息。关于内部记忆区域,如Eden / PermGen等,这对我没用。

我正在寻找类似的东西:
    最大内存:1GB
    最小内存:256 MB
    堆内存:700 MB
    使用的内存:460 MB

多数民众赞成。我知道我可以在JConsole等中看到这个,但我需要一个命令行工具(不能启用JMX等)。

任何此类工具/命令?

18 个答案:

答案 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是一个命令行工具,它提供多个指标的实时视图,包括堆。

VM概述模式的输出示例:

 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监视工具,它消失了:

  • 堆使用情况,大小和最大值
  • jvm processes
  • cpu和GC使用
  • 顶级帖子

工具打开时,指标和图表会更新。

示例:jvm-mon

答案 6 :(得分:6)

晚会,但一个非常简单的解决方案是使用jpsstat.sh脚本。它提供简单的实时当前内存最大内存 cpu使用详细信息。

  • 转到GitHub project并下载 jpsstat.sh 文件
  • 右键单击 jpsstat.sh 并转到权限标签并将其设为可执行文件
  • 现在使用以下命令 ./ 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

答案 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)

jcmd

要查找正在运行的 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)

从顶部查找您的webapp / java进程的进程ID。 使用jmap heap获取堆分配。我在AWS-Ec2上测试了弹性beantalk

您可以在下面的图像中看到该应用程序的最大堆空间为3GB

enter image description here