监控 java 8 个进程以查看实际内存使用情况

Monitoring java 8 processes to see actual memory use

我想在 Linux Centos 系统上监控 java 8 个进程并且能够 查看他们使用了多少内存。我更愿意使用 shell 实用程序,因为我希望最终将输出提供给我们的中央监控系统

我也对 java8 中的 -Xmx 选项感到困惑,它似乎对使用的内存量没有影响

这是获取 ps 有关 java 程序

信息的脚本
for jvm in `sudo -u services jps|awk '/.jar/ {print }'`; do ps up $jvm;done

输出

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
services  1409  0.0 10.8 4672536 872440 ?      Tl   Jun03   3:53 /usr/java/lates
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
services  1574  0.0 11.4 4743036 925536 ?      Sl   Jun03   3:13 /usr/java/lates
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
services 19839  0.7 10.9 4735664 881420 ?      Sl   09:43   0:15 /usr/java/lates

这是程序的一些设置

sudo -u services jps -lvm
1409 /usr/local/content-adapters/pmc-adapter/pmc-adapter.jar -Xmx1024m -Xms512m
1574 /usr/local/content-adapters/tools-adapter/tools-adapter.jar -Xmx512m
20685 sun.tools.jps.Jps -lvm -Dapplication.home=/usr/java/jdk1.8.0_65 -Xms8m
19839 /usr/local/content-adapters/cas-adapter/cas-adapter.jar

关于服务器默认值的一些信息

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
     intx CompilerThreadStackSize                   = 0                                   {pd product}
    uintx ErgoHeapSizeLimit                         = 0                                   {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
    uintx InitialHeapSize                          := 130023424                           {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx MaxHeapSize                              := 2063597568                          {product}
     intx ThreadStackSize                           = 1024                                {pd product}
     intx VMThreadStackSize                         = 1024                                {pd product}
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

如果我使用 jstat,我无法使各种 "use" 数字加起来达到 4.5GiB 以上 VSZ 号码或 800-900MiB RSS

我的问题是

  1. 如何将 -Xmx 和其他设置与实际使用的内存量相关联?
  2. 如何使用 jstat 显示正在使用的内存量?
  3. 大概 VSZ 和 RSS 的差异是由于所有 java 程序使用的某种共享资源。我如何估算或找到此指标?

除非你设置vm.overcommit_memory = 2,否则你不应该过多关注虚拟内存。 Reserved-but-not-allocated address-space 和 memory-mapped files 计入其中,因此该指标几乎没有用,因为 java 提前保留整个堆以获得连续可用区域。

RSS 通常更有趣,假设没有发生分页应该比当前分配的 java 堆稍大,而后者又可能小于最大 java 堆 (-Xmx)

假设未使用最大堆容量并且仅发生少量内存映射或直接字节缓冲区分配并且没有分页发生,则关系如下所示:

非垃圾对象 < Java 使用的堆 < Java 分配的堆 < RSS < Java 保留的堆 (Xmx) < VSZ

此外 Java 将内存用于元空间。此外,根据您的代码,java 可能会使用额外的内存作为字节缓冲区,直接内存。