Java MemoryMXBean使用的内存大于最大值

Java MemoryMXBean使用的内存大于最大值,java,memory,jmx,Java,Memory,Jmx,关于使用MemoryMXBean进行运行时内存分析,我得到了一个有趣的效果。 我想确定堆和非堆中的可用内存。 因此,我的代码如下所示: static MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); long fullused = mbean.getHeapMemoryUsage().getUsed() + mbean.getNonHeapMemoryUsage().getUsed(); long fullmax = mbean.

关于使用MemoryMXBean进行运行时内存分析,我得到了一个有趣的效果。 我想确定堆和非堆中的可用内存。 因此,我的代码如下所示:

static MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
long fullused = mbean.getHeapMemoryUsage().getUsed() + mbean.getNonHeapMemoryUsage().getUsed();
long fullmax = mbean.getHeapMemoryUsage().getMax() + mbean.getNonHeapMemoryUsage().getMax();
long fullfree = fullmax - fullused;
有时,fullFree的结果为负值。 这怎么可能?一个竞争条件,即在计算使用的mem之后进行一些垃圾收集?在我的日志中,我经常看到它,所以我怀疑竞赛条件理论。
这里还有其他想法吗?

非堆的最大值可以是-1。您可以通过应用程序的jconsole进行检查。
在热点源中,内存使用量的计算是通过
jmm_GetMemoryUsage
方法完成的。若其中一个非堆内存池具有未定义的最大大小,则整个非堆内存池中的最大大小将为-1。Metaspace池(没有MaxMetaspaceSize命令标志)有未定义的max size

Thanx,我将对此进行检查。