From 2bb3c290cb28f29053e8610c26a22ebdc687bad7 Mon Sep 17 00:00:00 2001 From: Stefan Johansson Date: Tue, 24 Feb 2026 15:52:59 +0000 Subject: [PATCH] 8380773: Extend ContainerMemoryUsageEvent to include host memory usage --- src/hotspot/share/jfr/jni/jfrJniMethod.cpp | 7 +++++++ src/hotspot/share/jfr/jni/jfrJniMethod.hpp | 2 ++ src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp | 1 + .../classes/jdk/jfr/events/ContainerMemoryUsageEvent.java | 5 +++++ src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java | 1 + src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java | 6 ++++++ 6 files changed, 22 insertions(+) diff --git a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp index 885484020bd..915d59d00a7 100644 --- a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp +++ b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp @@ -410,6 +410,13 @@ JVM_ENTRY_NO_ENV(jlong, jfr_host_total_swap_memory(JNIEnv* env, jclass jvm)) return static_cast(total_swap_space); JVM_END +JVM_ENTRY_NO_ENV(jlong, jfr_host_memory_usage(JNIEnv* env, jclass jvm)) + physical_memory_size_type memory_usage = 0; + // Return value ignored - defaulting to 0 on failure. + (void)os::Machine::used_memory(memory_usage); + return static_cast(memory_usage); +JVM_END + JVM_ENTRY_NO_ENV(void, jfr_emit_data_loss(JNIEnv* env, jclass jvm, jlong bytes)) EventDataLoss::commit(bytes, min_jlong); JVM_END diff --git a/src/hotspot/share/jfr/jni/jfrJniMethod.hpp b/src/hotspot/share/jfr/jni/jfrJniMethod.hpp index 9769df57bd3..bcdaf7a99b7 100644 --- a/src/hotspot/share/jfr/jni/jfrJniMethod.hpp +++ b/src/hotspot/share/jfr/jni/jfrJniMethod.hpp @@ -163,6 +163,8 @@ jlong JNICALL jfr_host_total_memory(JNIEnv* env, jclass jvm); jlong JNICALL jfr_host_total_swap_memory(JNIEnv* env, jclass jvm); +jlong JNICALL jfr_host_memory_usage(JNIEnv* env, jclass jvm); + void JNICALL jfr_emit_data_loss(JNIEnv* env, jclass jvm, jlong bytes); jlong JNICALL jfr_register_stack_filter(JNIEnv* env, jclass jvm, jobjectArray classes, jobjectArray methods); diff --git a/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp b/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp index 2979f5c5c2d..0813289e840 100644 --- a/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp +++ b/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp @@ -101,6 +101,7 @@ JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) { (char*)"isContainerized", (char*)"()Z", (void*) jfr_is_containerized, (char*)"hostTotalMemory", (char*)"()J", (void*) jfr_host_total_memory, (char*)"hostTotalSwapMemory", (char*)"()J", (void*) jfr_host_total_swap_memory, + (char*)"hostMemoryUsage", (char*)"()J", (void*) jfr_host_memory_usage, (char*)"emitDataLoss", (char*)"(J)V", (void*)jfr_emit_data_loss, (char*)"registerStackFilter", (char*)"([Ljava/lang/String;[Ljava/lang/String;)J", (void*)jfr_register_stack_filter, (char*)"unregisterStackFilter", (char*)"(J)V", (void*)jfr_unregister_stack_filter, diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ContainerMemoryUsageEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ContainerMemoryUsageEvent.java index 285952d0c66..9a83877a967 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ContainerMemoryUsageEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ContainerMemoryUsageEvent.java @@ -50,4 +50,9 @@ public final class ContainerMemoryUsageEvent extends AbstractPeriodicEvent { @Description("Amount of physical memory and swap space, in bytes, that is currently allocated in the current container") @DataAmount public long swapMemoryUsage; + + @Label("Host Memory Usage") + @Description("Amount of physical memory, in bytes, that is currently allocated in the host system") + @DataAmount + public long hostMemoryUsage; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java index 53d40c1e5e1..79bc614545e 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java @@ -181,6 +181,7 @@ public final class JDKEvents { event.memoryFailCount = containerMetrics.getMemoryFailCount(); event.memoryUsage = containerMetrics.getMemoryUsage(); event.swapMemoryUsage = containerMetrics.getMemoryAndSwapUsage(); + event.hostMemoryUsage = JVM.hostMemoryUsage(); event.commit(); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java index 24c92e81a4c..2aa7dfd6e97 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java @@ -657,6 +657,12 @@ public final class JVM { */ public static native long hostTotalSwapMemory(); + /** + * Returns the amount of memory used in the host system whether or not this + * JVM runs in a container. + */ + public static native long hostMemoryUsage(); + /** * Emit a jdk.DataLoss event for the specified amount of bytes. *