Java MemoryMXBean 使用的内存大于最大值
Java MemoryMXBean Used Memory bigger than Max
关于使用 MemoryMXBean 进行运行时内存分析,我得到了一个有趣的结果。
我想和 NonHeap 一起确定 Heap 中的空闲内存。
所以我的代码如下所示:
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 的结果是负值。
怎么可能?在计算已用内存后进行了一些垃圾收集的竞争条件?在我的日志中,我经常看到它,所以我怀疑竞争条件理论。
还有其他想法吗?
非堆的最大值可以是 -1。您可以通过 jconsole 检查您的应用程序。
在热点源中,内存使用的计算是在 jmm_GetMemoryUsage
方法中完成的。如果其中一个非堆内存池具有未定义的最大大小,则整个非堆中的最大大小将为 -1。元空间池(没有 MaxMetaspaceSize 命令标志)具有未定义的最大大小
关于使用 MemoryMXBean 进行运行时内存分析,我得到了一个有趣的结果。 我想和 NonHeap 一起确定 Heap 中的空闲内存。 所以我的代码如下所示:
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 的结果是负值。 怎么可能?在计算已用内存后进行了一些垃圾收集的竞争条件?在我的日志中,我经常看到它,所以我怀疑竞争条件理论。 还有其他想法吗?
非堆的最大值可以是 -1。您可以通过 jconsole 检查您的应用程序。
在热点源中,内存使用的计算是在 jmm_GetMemoryUsage
方法中完成的。如果其中一个非堆内存池具有未定义的最大大小,则整个非堆中的最大大小将为 -1。元空间池(没有 MaxMetaspaceSize 命令标志)具有未定义的最大大小