< 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 >