Java MemoryMXBean使用的内存大于Max

时间:2016-06-22 13:39:11

标签: java memory jmx

我使用MemoryMXBean对运行时内存分析产生了一个有趣的影响。 我想与NonHeap一起确定堆中的可用内存。 所以我的代码看起来像这样:

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 个答案:

答案 0 :(得分:2)

NonHeap的最大值可以是-1。您可以通过jconsole检查您的应用程序。 在热点源中,使用jmm_GetMemoryUsage方法计算内存使用情况。如果其中一个非堆内存池具有未定义的最大大小,则整个非堆中的最大大小将为-1。元空间池(没有MaxMetaspaceSize命令标志)具有未定义的最大大小