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