From 8bec5e7e16c38a3d2a4be37f32dd447097ec38b1 Mon Sep 17 00:00:00 2001 From: bowenlan-amzn Date: Wed, 20 May 2026 16:51:21 -0700 Subject: [PATCH] Fix direct_memory_bytes to report actual direct buffer usage The previous implementation used MemoryMXBean.getNonHeapMemoryUsage() which reports metaspace + code cache + compressed class space -- not actual direct ByteBuffer allocations. The fallback (heap usage) was also incorrect. Replace with BufferPoolMXBean filtered on the 'direct' pool, which reports actual JVM direct buffer memory managed by ByteBuffer.allocateDirect(). Signed-off-by: bowenlan-amzn --- .../arrow/flight/stats/FlightStatsCollector.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/arrow-flight-rpc/src/main/java/org/opensearch/arrow/flight/stats/FlightStatsCollector.java b/plugins/arrow-flight-rpc/src/main/java/org/opensearch/arrow/flight/stats/FlightStatsCollector.java index 7e46f3072a31e..f35be2f8ed086 100644 --- a/plugins/arrow-flight-rpc/src/main/java/org/opensearch/arrow/flight/stats/FlightStatsCollector.java +++ b/plugins/arrow-flight-rpc/src/main/java/org/opensearch/arrow/flight/stats/FlightStatsCollector.java @@ -117,10 +117,16 @@ private void updateResourceMetrics() { long directMemoryBytes = 0; try { - java.lang.management.MemoryMXBean memoryBean = java.lang.management.ManagementFactory.getMemoryMXBean(); - directMemoryBytes = memoryBean.getNonHeapMemoryUsage().getUsed(); + for (java.lang.management.BufferPoolMXBean pool : java.lang.management.ManagementFactory.getPlatformMXBeans( + java.lang.management.BufferPoolMXBean.class + )) { + if ("direct".equals(pool.getName())) { + directMemoryBytes = pool.getMemoryUsed(); + break; + } + } } catch (Exception e) { - directMemoryBytes = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + directMemoryBytes = 0; } int clientThreadsActive = 0;