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

Jas*_*per 154 java linux memory heap performance

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

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

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

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

任何这样的工具/命令?

far*_*992 140

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

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

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

  • jstat -gcutil [insert-pid-here]将把每一代的利用率作为其能力的百分比.有助于快速了解使用情况.

请参阅Oracle网站上的jstat文档.

  • 是否建议使用`jstat`的选项来验证JVM的整体内存使用情况?假设您使用`Xms = 4g`和`Xmx = 4g`启动JVM并且您想看看,已经使用了多少内存? (10认同)
  • “jstat -gcutil <pid> 250 N”对于以 250 毫秒间隔获取 N 个样本并将输出显示为相应空间的百分比非常有用。谢谢。 (4认同)
  • 值得注意的是`jstat` Oracle Java 8手册[页码](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html):`这个命令是实验性的,不受支持的` . (3认同)
  • `awk 'print {$3+$4+$6+$8}'` 可以打印 Java 8 的 jstat 列的汇总使用情况 (2认同)
  • 或 `awk 'NR>1 {print $3+$4+$6+$8}'` 跳过带有列标题的第一行 (2认同)

MRa*_*ser 61

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
Run Code Online (Sandbox Code Playgroud)

  • 由于tools.jar依赖,仅适用于java 8 (8认同)

Atm*_*tma 57

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

java -XX:+PrintFlagsFinal -version | grep HeapSize
Run Code Online (Sandbox Code Playgroud)

它也适用于EC2上的Amazon AMI.

  • 这不回答这个问题,它专门询问如何检查进程的堆使用情况.此处的命令列出了所有进程的JVM默认值. (18认同)
  • 然而,对于我通过谷歌搜索来访问此页面如何找到全局堆大小,这是一个非常有用的答案. (6认同)
  • 最初的问题的标题很模糊,因此应该保留为列出的答案。此外,这是在谷歌上最容易找到的回答配置问题的答案。 (2认同)

pad*_*ist 37

试试这个在Ubuntu和RedHat中工作:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Run Code Online (Sandbox Code Playgroud)

对于Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Run Code Online (Sandbox Code Playgroud)

对于Mac

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
Run Code Online (Sandbox Code Playgroud)

所有这些命令的输出类似于下面的输出:

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)
Run Code Online (Sandbox Code Playgroud)

要以MB为单位查找大小,请将值除以(1024*1024).

  • @GaryGauh这是默认的堆大小.要查找正在运行的应用程序的用法,您应该在代码中执行它,或者您可以使用jconsole.这就是我所知道的还应该有很多其他方法. (3认同)
  • 使用`jstat -gc <vmid>`运行应用程序。 (2认同)

Pet*_*rey 24

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

jps -lvm
Run Code Online (Sandbox Code Playgroud)

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

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

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


And*_*ejs 19

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

  • 堆使用,大小和最大值
  • jvm进程
  • cpu和GC使用情况
  • 顶线

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

样品: JVM-MON

  • 请注意 jvm-mon 仅适用于 Java8 (2认同)

vai*_*pta 18

Java8 及更高版本,您可以使用以下命令:

jcmd JAVA_PROCESS_IDGC.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
Run Code Online (Sandbox Code Playgroud)

有关 jcmd 命令的更多详细信息,请访问此处的链接

  • @PavelMolchanov 我可以在 jdk1.8.0_172 中使用该命令。/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info。如果可以的话,请将信息添加到引用的线程中,并且到目前为止我没有足够的声誉来添加评论。 (4认同)
  • FWIW,“GC.heap_info”在 OpenJDK 8 中也绝对可用。也许只在最近的版本中?我正在使用这个:8u191-b12-2ubuntu0.18.04.1 (2认同)

fro*_*tin 11

在我的情况下,我需要检查没有大多数基本实用程序(ps、pstree ...)的 docker 容器内的标志

使用jps我得到了正在运行的 JVM 的 PID(在我的情况 1 中),然后jcmd 1 VM.flags我从正在运行的 JVM 中得到了标志。

这取决于您可以使用哪些命令,但这可能会对某人有所帮助。:)


ama*_*and 8

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

  • 转到GitHub项目并下载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
Run Code Online (Sandbox Code Playgroud)


Yuc*_*uci 6

就Java堆大小而言,在Linux中,可以使用

ps aux | grep java
Run Code Online (Sandbox Code Playgroud)

或者

ps -ef | grep java
Run Code Online (Sandbox Code Playgroud)

并查找 -Xms、-Xmx 以找出指定的初始堆大小和最大堆大小。

但是,如果您感兴趣的 Java 进程缺少 -Xms 或 -Xmx,则意味着您的 Java 进程正在使用默认堆大小。您可以使用以下命令来查找默认大小。

java -XX:+PrintFlagsFinal -version | grep HeapSize
Run Code Online (Sandbox Code Playgroud)

或特定的 jvm,例如,

/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize
Run Code Online (Sandbox Code Playgroud)

并查找 InitialHeapSize 和 MaxHeapSize(以字节为单位)。


sja*_*jas 5

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

jps -lvm
Run Code Online (Sandbox Code Playgroud)

然后在此处使用进程 ID:

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
Run Code Online (Sandbox Code Playgroud)


kis*_*sna 5

任何方法都应该给您大致相同的数字。分配-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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)

最大值

     NGCMX + S0C + S1C + EC    + OGCMX   + MCMX    + CCSMX
   3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
Run Code Online (Sandbox Code Playgroud)

(大约和低于VIRT内存)

最大(最小,已用):

215040 + 512 + 512 + 67072 + 430080  + 39680    +  4864  = ~ 1GB
Run Code Online (Sandbox Code Playgroud)

(大致接近RES内存)

“不要在此引用我的信息”,但是VIRT mem大约接近或大于分配的最大内存,但是只要正在使用的内存在物理内存中是可用的/可用的,JVM就不会抛出内存异常。实际上,即使在OS上关闭了交换,在JVM启动时也不会针对物理内存检查最大内存。真正使用由Java程序什么的虚拟内存更好的解释是讨论在这里


vsi*_*ngh 5

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

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

在此输入图像描述

  • 对原始问题的完美答案,不仅显示最大分配的堆大小,还显示当前使用的堆。屏幕截图中未显示,但 jmap heap 命令以绝对值和百分比值显示可用空间和已用空间。您可能必须直接使用 jhsdb 而不是 jmap : jhsdb jmap --heap --pid <your PID> (4认同)