< 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,38 **** --- 26,42 ---- package jdk.jfr.internal.instrument; import java.util.ArrayList; import java.util.List; + import jdk.internal.access.JavaNioAccess.BufferPool; + 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,81 **** ActiveSettingEvent.class, ActiveRecordingEvent.class, jdk.internal.event.SecurityPropertyModificationEvent.class, jdk.internal.event.TLSHandshakeEvent.class, jdk.internal.event.X509CertificateEvent.class, ! jdk.internal.event.X509ValidationEvent.class }; // This is a list of the classes with instrumentation code that should be applied. private static final Class<?>[] instrumentationClasses = new Class<?>[] { FileInputStreamInstrumentor.class, --- 75,86 ---- ActiveSettingEvent.class, ActiveRecordingEvent.class, jdk.internal.event.SecurityPropertyModificationEvent.class, jdk.internal.event.TLSHandshakeEvent.class, jdk.internal.event.X509CertificateEvent.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,97 **** --- 93,103 ---- }; 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,111 **** --- 108,118 ---- 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,164 **** --- 165,185 ---- return oldBytes; } public static void remove() { RequestEngine.removeHook(JDKEvents::emitExceptionStatistics); + RequestEngine.removeHook(emitDirectMemoryStatistics); + } + + private static final BufferPool DIRECT_BUFFER_POOL = VM.getBufferPools().stream() + .filter(p -> "direct".equals(p.getName())) + .findFirst().get(); + + private static void emitDirectMemoryStatistics() { + DirectMemoryStatisticsEvent e = new DirectMemoryStatisticsEvent(); + e.count = DIRECT_BUFFER_POOL.getCount(); + e.totalCapacity = DIRECT_BUFFER_POOL.getTotalCapacity(); + e.memoryUsed = DIRECT_BUFFER_POOL.getMemoryUsed(); + e.maxCapacity = VM.maxDirectMemory(); + e.commit(); } }
< prev index next >