--- old/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java 2020-03-05 14:19:30.869245045 +0800 +++ new/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java 2020-03-05 14:19:30.737240236 +0800 @@ -28,9 +28,14 @@ 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; @@ -73,7 +78,8 @@ 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. @@ -90,6 +96,7 @@ 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") @@ -104,6 +111,7 @@ } 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()); @@ -160,5 +168,16 @@ 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(); } }