Java 进程 snmp 监控报告 Eden 和 Survivor Space 的最大值为零

Java process snmp monitoring reports max values for Eden and Survivor Space are zero

我正在通过 Linux 框中的 SNMP 端口(配置 com.sun.management.snmp 属性)监视 WildFly 10.1。0.Final Java 进程。

问题是 EdenSurvivor 空间报告的 max 值为零。

.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.11.4 = Counter64: 775946240
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.10.4 = Counter64: 3946840064
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.12.4 = Counter64: 3774873600
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.13.4 = Counter64: 0
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.11.5 = Counter64: 4194304
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.10.5 = Counter64: 0
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.12.5 = Counter64: 4194304
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.13.5 = Counter64: 0
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.2 = STRING: "Metaspace"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.3 = STRING: "Compressed Class Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.4 = STRING: "G1 Eden Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.5 = STRING: "G1 Survivor Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.6 = STRING: "G1 Old Gen"

许多其他 Java 进程中使用了相同的监控脚本,这些进程未报告此问题。

是什么原因造成的? 这些值可以为零吗?

此致

这里的问题是 jvmMemPoolMaxSize (OID .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.13) 在 JVM-MANAGEMENT-MIB 中定义为类型 JvmUnsigned64TC,这看起来有点奇怪,因为 Java特别禁止使用无符号整数类型。

jvmMemPoolMaxSize 的描述意味着它代表 java.lang.management.MemoryPoolMXBean.getUsage().getMax() 返回的值。该方法的 documentation 表示“如果未定义最大内存大小,则此方法 returns -1。”

jvmMgmMIB 的描述通过以下解释解决了问题:

Where the Java programming language API uses long, or int, the MIB often uses the corresponding unsigned quantity - which is closer to the object semantics.

In those cases, it often happens that the -1 value that might be used by the API to indicate an unknown/unimplemented value cannot be used. Instead the MIB uses the value 0, which stricly speaking cannot be distinguished from a valid value. In many cases however, a running system will have non-zero values, so using 0 instead of -1 to indicate an unknown quantity does not lose any functionality.

我认为可以肯定地说这是零无效的情况之一,因此您应该将其理解为没有定义的最大值。