如果我通过创建缓冲区ByteBuffer.allocateDirect(),则内存存在于Java堆之外.有没有办法以跨平台的方式从我的应用程序中测量这种内存使用情况,类似于我如何使用Runtime.totalMemory()和测量Java堆使用情况Runtime.freeMemory()?
您可以使用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();
}
Run Code Online (Sandbox Code Playgroud)
打印类似:
direct
122
memory used 456.1562509536743 MB
total capacity456.15625 MB
mapped
0
memory used 0.0 MB
total capacity0.0 MB
Run Code Online (Sandbox Code Playgroud)
toMB函数在哪里:
private static String toMB(long init) {
return (Long.valueOf(init).doubleValue() / (1024 * 1024)) + " MB";
}
Run Code Online (Sandbox Code Playgroud)
但是,我不是100%确定直接字节缓冲区是否是唯一可以存在于直接内存中的东西。也许还有其他事情...
您可以使用反射来获取Bits.reservedMemoryOpenJDK/HotSpot Java 7。没有独立于平台的方式,这仅向您显示通过 ByteBuffer.allocateDirect() 的使用情况,而不是任何其他分配本机内存的方式。
另一种方法是解析/proc/{pid}/maps并排除文件映射。这是您的进程正在使用的虚拟内存的近似值。
| 归档时间: |
|
| 查看次数: |
4903 次 |
| 最近记录: |