< prev index next >

src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java

Print this page
rev 58228 : 8238665: Add JFR event for direct memory statistics

@@ -26,13 +26,18 @@
 package jdk.jfr.internal.instrument;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import jdk.internal.access.JavaNioAccess;
+import jdk.internal.access.SharedSecrets;
+import jdk.internal.misc.VM;
+
 import jdk.jfr.Event;
 import jdk.jfr.events.ActiveRecordingEvent;
 import jdk.jfr.events.ActiveSettingEvent;
+import jdk.jfr.events.DirectMemoryStatisticsEvent;
 import jdk.jfr.events.ErrorThrownEvent;
 import jdk.jfr.events.ExceptionStatisticsEvent;
 import jdk.jfr.events.ExceptionThrownEvent;
 import jdk.jfr.events.FileForceEvent;
 import jdk.jfr.events.FileReadEvent;

@@ -71,11 +76,12 @@
         ActiveSettingEvent.class,
         ActiveRecordingEvent.class,
         jdk.internal.event.SecurityPropertyModificationEvent.class,
         jdk.internal.event.TLSHandshakeEvent.class,
         jdk.internal.event.X509CertificateEvent.class,
-        jdk.internal.event.X509ValidationEvent.class
+        jdk.internal.event.X509ValidationEvent.class,
+        DirectMemoryStatisticsEvent.class
     };
 
     // This is a list of the classes with instrumentation code that should be applied.
     private static final Class<?>[] instrumentationClasses = new Class<?>[] {
         FileInputStreamInstrumentor.class,

@@ -88,10 +94,11 @@
     };
 
     private static final Class<?>[] targetClasses = new Class<?>[instrumentationClasses.length];
     private static final JVM jvm = JVM.getJVM();
     private static final Runnable emitExceptionStatistics = JDKEvents::emitExceptionStatistics;
+    private static final Runnable emitDirectMemoryStatistics = JDKEvents::emitDirectMemoryStatistics;
     private static boolean initializationTriggered;
 
     @SuppressWarnings("unchecked")
     public synchronized static void initialize() {
         try {

@@ -102,10 +109,11 @@
                 for (Class<?> eventClass : eventClasses) {
                     SecuritySupport.registerEvent((Class<? extends Event>) eventClass);
                 }
                 initializationTriggered = true;
                 RequestEngine.addTrustedJDKHook(ExceptionStatisticsEvent.class, emitExceptionStatistics);
+                RequestEngine.addTrustedJDKHook(DirectMemoryStatisticsEvent.class, emitDirectMemoryStatistics);
             }
         } catch (Exception e) {
             Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Could not initialize JDK events. " + e.getMessage());
         }
     }

@@ -158,7 +166,18 @@
         return oldBytes;
     }
 
     public static void remove() {
         RequestEngine.removeHook(JDKEvents::emitExceptionStatistics);
+        RequestEngine.removeHook(emitDirectMemoryStatistics);
+    }
+
+    private static void emitDirectMemoryStatistics() {
+        DirectMemoryStatisticsEvent e = new DirectMemoryStatisticsEvent();
+        JavaNioAccess.BufferPool pool = SharedSecrets.getJavaNioAccess().getDirectBufferPool();
+        e.count = pool.getCount();
+        e.totalCapacity = pool.getTotalCapacity();
+        e.memoryUsed = pool.getMemoryUsed();
+        e.maxCapacity = VM.maxDirectMemory();
+        e.commit();
     }
 }
< prev index next >