首页 文章

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

提问于
浏览
122

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

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

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

就这样 . 我知道我可以在JConsole等中看到这个,但我需要一个命令行工具(不能启用JMX等)

任何这样的工具/命令?

13 回答

  • 1

    有一个具有可视方面的命令行工具 - jvm-mon . 它是命令行的JVM监视工具,它消失了:

    • 堆使用情况,大小和最大值

    • jvm进程

    • cpu和GC用法

    • 顶级主题

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

    样品:
    jvm-mon

  • 5

    每个Java进程都有 pid ,您首先需要使用 jps 命令找到它 .

    获得pid后,可以使用 jstat -gc [insert-pid-here] 查找垃圾收集堆行为的统计信息 .

    • jstat -gccapacity [insert-pid-here] 将显示有关内存池生成和空间功能的信息 .

    • jstat -gcutil [insert-pid-here] 将以每个发电容量的百分比表示每一代的利用率 . 有助于快速了解使用情况 .

    请参阅Oracle网站上的jstat docs .

  • 13

    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
    
  • 1

    此命令显示配置的堆大小(以字节为单位) .

    java -XX:+PrintFlagsFinal -version | grep HeapSize
    

    它也适用于EC2上的Amazon AMI .

  • 3

    试试这个在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) .

  • 1

    不使用大多数工具使用的JMX,您所能做的就是使用

    jps -lvm
    

    并推断设置将来自命令行选项 .

    默认情况下,如果没有JMX,您将无法获取动态信息,但您可以编写自己的服务来执行此操作 .

    顺便说一句:我更喜欢使用VisualVM而不是JConsole .

  • 116

    晚会,但一个非常简单的解决方案是使用jpsstat.sh脚本 . 它提供了一个简单的直播 current memorymax memorycpu use 细节 .

    • 转到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
    
  • 47

    任何方法都应该给你大致相同的数字 . 为所有代使用 -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

    MaxNGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX 3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB

    (大致接近和低于VIRT记忆)

    Max(Min, Used): 215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB

    (大致接近RES内存)

    "Don't quote me on this"但是VIRT mem大致接近或超过分配的最大内存,但只要 memory being used 在物理内存中是空闲/可用的,JVM就不会引发内存异常 . 事实上,即使在操作系统上关闭了交换机,JVM启动时也不会根据物理内存检查最大内存 . 更好地解释了Java进程真正使用的虚拟内存here .

  • 27

    首先从下列之一获取进程ID,即列出的进程中的第一个数字:(或者只使用 ps aux | grep java ,如果您愿意的话)

    jps -lvm
    

    然后在此处使用进程ID:

    jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
    jmap -permstat $MY_PID
    
  • 59

    如果使用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

  • 1

    使用 top 命令是检查程序内存使用情况的最简单方法 . RES 列显示进程占用的实际物理内存 .

    对于我的情况,我在java中读取了一个10g文件,每次我得到outOfMemory异常 . 当 RES 列中的值达到 -Xmx 选项中设置的值时,会发生这种情况 . 然后通过使用 -Xmx 选项增加内存,一切都很顺利 .

  • 22
    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获取更多相关细节

  • 2

    就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,以字节为单位 .

相关问题