changeset 14458:cb560b38d15a

8266723: JFR periodic events are causing extra allocations Reviewed-by: adinn
author jbachorik
date Fri, 07 May 2021 17:23:30 +0200
parents 6a07e2cb5bdb
children 93a23f95f629
files src/share/classes/jdk/jfr/internal/JVM.java src/share/classes/jdk/jfr/internal/Logger.java src/share/classes/jdk/jfr/internal/RequestEngine.java
diffstat 3 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/jdk/jfr/internal/JVM.java	Thu May 20 16:26:15 2021 +0300
+++ b/src/share/classes/jdk/jfr/internal/JVM.java	Fri May 07 17:23:30 2021 +0200
@@ -177,6 +177,14 @@
      */
     public static native void log(int tagSetId, int level, String message);
 
+    /**
+     * Check whether the logger would output on the given level
+     *
+     * @param level on level
+     * @return {@literal true} if the logger would output on the given level
+     */
+    public static native boolean shouldLog(int level);
+
      /**
       * Subscribe to LogLevel updates for LogTag
       *
@@ -524,4 +532,4 @@
      * @return if it is time to perform a chunk rotation
      */
     public native boolean shouldRotateDisk();
-}
+}
\ No newline at end of file
--- a/src/share/classes/jdk/jfr/internal/Logger.java	Thu May 20 16:26:15 2021 +0300
+++ b/src/share/classes/jdk/jfr/internal/Logger.java	Fri May 07 17:23:30 2021 +0200
@@ -62,8 +62,6 @@
     }
 
     public static boolean shouldLog(LogTag tag, LogLevel level) {
-        // Logging level is not initialized because of lack of Xlog support in jdk8,
-        // so this method returns true directly now.
-        return true; // TODO: level.level >= tag.tagSetLevel;
+        return JVM.shouldLog(level.level);
     }
 }
--- a/src/share/classes/jdk/jfr/internal/RequestEngine.java	Thu May 20 16:26:15 2021 +0300
+++ b/src/share/classes/jdk/jfr/internal/RequestEngine.java	Fri May 07 17:23:30 2021 +0200
@@ -67,7 +67,9 @@
                     } else {
                         jvm.emitEvent(type.getId(), JVM.counterTime(), 0);
                     }
-                    Logger.log(LogTag.JFR_SYSTEM_EVENT, LogLevel.DEBUG, ()-> "Executed periodic hook for " + type.getLogName());
+                    if (Logger.shouldLog(LogTag.JFR_EVENT, LogLevel.DEBUG)) {
+                        Logger.log(LogTag.JFR_SYSTEM_EVENT, LogLevel.DEBUG, ()-> "Executed periodic hook for " + type.getLogName());
+                    }
                 } else {
                     executeSecure();
                 }
@@ -83,7 +85,9 @@
                 public Void run() {
                     try {
                         hook.run();
-                        Logger.log(LogTag.JFR_EVENT, LogLevel.DEBUG, ()-> "Executed periodic hook for " + type.getLogName());
+                        if (Logger.shouldLog(LogTag.JFR_EVENT, LogLevel.DEBUG)) {
+                            Logger.log(LogTag.JFR_EVENT, LogLevel.DEBUG, ()-> "Executed periodic hook for " + type.getLogName());
+                        }
                     } catch (Throwable t) {
                         // Prevent malicious user to propagate exception callback in the wrong context
                         Logger.log(LogTag.JFR_EVENT, LogLevel.WARN, "Exception occured during execution of period hook for " + type.getLogName());