If I create a buffer via ByteBuffer.allocateDirect()
, the memory exists outside of the Java heap. Is there a way to measure this kind of memory usage from my a
You can use MXBeans to get the memory used by the direct byte buffers and mapped byte buffers:
List 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();
}
prints something like:
direct
122
memory used 456.1562509536743 MB
total capacity456.15625 MB
mapped
0
memory used 0.0 MB
total capacity0.0 MB
where toMB function is this:
private static String toMB(long init) {
return (Long.valueOf(init).doubleValue() / (1024 * 1024)) + " MB";
}
However, I am not 100% sure if direct byte buffers are the only things that can live in the direct memory. Perhaps there are other things...