< 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,17 @@
package jdk.jfr.internal.instrument;
import java.util.ArrayList;
import java.util.List;
+import jdk.internal.misc.VM;
+import jdk.internal.misc.VM.BufferPool;
+
import jdk.jfr.Event;
import jdk.jfr.events.ActiveRecordingEvent;
import jdk.jfr.events.ActiveSettingEvent;
+import jdk.jfr.events.DirectBufferStatisticsEvent;
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 +75,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,
+ DirectBufferStatisticsEvent.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 +93,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 emitDirectBufferStatistics = JDKEvents::emitDirectBufferStatistics;
private static boolean initializationTriggered;
@SuppressWarnings("unchecked")
public synchronized static void initialize() {
try {
@@ -102,10 +108,11 @@
for (Class<?> eventClass : eventClasses) {
SecuritySupport.registerEvent((Class<? extends Event>) eventClass);
}
initializationTriggered = true;
RequestEngine.addTrustedJDKHook(ExceptionStatisticsEvent.class, emitExceptionStatistics);
+ RequestEngine.addTrustedJDKHook(DirectBufferStatisticsEvent.class, emitDirectBufferStatistics);
}
} catch (Exception e) {
Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Could not initialize JDK events. " + e.getMessage());
}
}
@@ -158,7 +165,21 @@
return oldBytes;
}
public static void remove() {
RequestEngine.removeHook(JDKEvents::emitExceptionStatistics);
+ RequestEngine.removeHook(emitDirectBufferStatistics);
+ }
+
+ private static final BufferPool DIRECT_BUFFER_POOL = VM.getBufferPools().stream()
+ .filter(p -> "direct".equals(p.getName()))
+ .findFirst().get();
+
+ private static void emitDirectBufferStatistics() {
+ DirectBufferStatisticsEvent e = new DirectBufferStatisticsEvent();
+ 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 >