如果我通过ByteBuffer.allocateDirect()
创建缓冲区,则内存存在于Java堆之外。有没有办法以跨平台的方式从我的应用程序中测量这种内存使用情况,类似于我如何使用Runtime.totalMemory()
和Runtime.freeMemory()
来衡量Java堆的使用情况?
答案 0 :(得分:5)
您可以使用MXBeans来获取直接字节缓冲区和映射字节缓冲区使用的内存:
List<BufferPoolMXBean> pools = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
for (BufferPoolMXBean pool : pools) {
System.out.println(pool.getName());
System.out.println(pool.getCount());
System.out.println("memory used " + toMB(pool.getMemoryUsed()));
System.out.println("total capacity" + toMB(pool.getTotalCapacity()));
System.out.println();
}
打印如下内容:
direct
122
memory used 456.1562509536743 MB
total capacity456.15625 MB
mapped
0
memory used 0.0 MB
total capacity0.0 MB
其中toMB功能是这样的:
private static String toMB(long init) {
return (Long.valueOf(init).doubleValue() / (1024 * 1024)) + " MB";
}
但是,我不能100%确定直接字节缓冲区是否可以存在于直接内存中。也许还有其他的事情......
答案 1 :(得分:2)
您可以使用反射在OpenJDK / HotSpot Java 7上获取Bits.reservedMemory
。没有独立于平台的方式,这只能通过ByteBuffer.allocateDirect()显示您的使用情况,而不是任何其他分配本机内存的方式。< / p>
另一种方法是解析/proc/{pid}/maps
并排除文件映射。这是您的流程使用的虚拟内存的近似值。