If you're trying to opt for performance: Runtime.getRuntime().totalMemory()/freeMemory()/maxMemory() are inlined native calls, whereas MemoryMXBean.getHeapMemoryUsage() involves more indirection and object allocation.
Runtime.getRuntime().totalMemory()
freeMemory()
maxMemory()
MemoryMXBean.getHeapMemoryUsage()