# HG changeset patch # User egahlin # Date 1562936668 -7200 # Node ID 025c9b8eaefdf588f5cf0e0a854427bf61c4d3cd # Parent de154169948bfe2a17c0c2809407cef97815d3d9 Reduce jfr framework overhead diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java Fri Jul 12 15:04:28 2019 +0200 @@ -101,7 +101,7 @@ } public boolean isEnabled() { - return this.enabled; + return enabled; } public RecordedEvent parse(RecordingInput input) throws IOException { @@ -110,16 +110,16 @@ } long startTicks = input.readLong(); - long durationTicks = 0; + long endTicks = startTicks; if (hasDuration) { - durationTicks = input.readLong(); + long durationTicks = input.readLong(); if (thresholdNanos > 0L) { if (timeConverter.convertTimespan(durationTicks) < thresholdNanos) { return null; } } + endTicks += durationTicks; } - long endTicks = startTicks + durationTicks; if (firstNanos > 0L) { if (timeConverter.convertTimestamp(endTicks) < firstNanos) { return null; diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/consumer/ParserFactory.java --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/ParserFactory.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/ParserFactory.java Fri Jul 12 15:04:28 2019 +0200 @@ -204,10 +204,11 @@ @Override public Object parse(RecordingInput input) throws IOException { long l = input.readLong(); - if (l != last) { - last = l; - lastLongObject = Long.valueOf(l); + if (l == last) { + return lastLongObject; } + last = l; + lastLongObject = Long.valueOf(l); return lastLongObject; } diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java Fri Jul 12 15:04:28 2019 +0200 @@ -40,6 +40,13 @@ @StackTrace(false) public final class ActiveRecordingEvent extends AbstractJDKEvent { + public static final ThreadLocal EVENT = new ThreadLocal() { + @Override + protected ActiveRecordingEvent initialValue() { + return new ActiveRecordingEvent(); + } + }; + @Label("Id") public long id; diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java Fri Jul 12 15:04:28 2019 +0200 @@ -37,6 +37,13 @@ @StackTrace(false) public final class ActiveSettingEvent extends AbstractJDKEvent { + public static final ThreadLocal EVENT = new ThreadLocal() { + @Override + protected ActiveSettingEvent initialValue() { + return new ActiveSettingEvent(); + } + }; + @Label("Event Id") public long id; diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java Fri Jul 12 15:04:28 2019 +0200 @@ -32,11 +32,7 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import jdk.internal.module.Modules; import jdk.jfr.AnnotationElement; @@ -59,7 +55,14 @@ // holds SettingControl instances that need to be released // when a class is unloaded (to avoid memory leaks). public final class EventControl { - + final static class NamedControl { + public final String name; + public final Control control; + NamedControl(String name, Control control) { + this.name = name; + this.control = control; + } + } static final String FIELD_SETTING_PREFIX = "setting"; private static final Type TYPE_ENABLED = TypeLibrary.createType(EnabledSetting.class); private static final Type TYPE_THRESHOLD = TypeLibrary.createType(ThresholdSetting.class); @@ -67,24 +70,24 @@ private static final Type TYPE_PERIOD = TypeLibrary.createType(PeriodSetting.class); private static final Type TYPE_CUTOFF = TypeLibrary.createType(CutoffSetting.class); - private final List settingInfos = new ArrayList<>(); - private final Map eventControls = new HashMap<>(5); + private final ArrayList settingInfos = new ArrayList<>(); + private final ArrayList namedControls = new ArrayList<>(5); private final PlatformEventType type; private final String idName; EventControl(PlatformEventType eventType) { - eventControls.put(Enabled.NAME, defineEnabled(eventType)); + addControl(Enabled.NAME, defineEnabled(eventType)); if (eventType.hasDuration()) { - eventControls.put(Threshold.NAME, defineThreshold(eventType)); + addControl(Threshold.NAME, defineThreshold(eventType)); } if (eventType.hasStackTrace()) { - eventControls.put(StackTrace.NAME, defineStackTrace(eventType)); + addControl(StackTrace.NAME, defineStackTrace(eventType)); } if (eventType.hasPeriod()) { - eventControls.put(Period.NAME, definePeriod(eventType)); + addControl(Period.NAME, definePeriod(eventType)); } if (eventType.hasCutoff()) { - eventControls.put(Cutoff.NAME, defineCutoff(eventType)); + addControl(Cutoff.NAME, defineCutoff(eventType)); } ArrayList aes = new ArrayList<>(eventType.getAnnotationElements()); @@ -99,6 +102,19 @@ this.idName = String.valueOf(eventType.getId()); } + private boolean hasControl(String name) { + for (NamedControl nc : namedControls) { + if (name.equals(nc.name)) { + return true; + } + } + return false; + } + + private void addControl(String name, Control control) { + namedControls.add(new NamedControl(name, control)); + } + static void remove(PlatformEventType type, List aes, Class clazz) { long id = Type.getTypeId(clazz); for (AnnotationElement a : type.getAnnotationElements()) { @@ -131,7 +147,8 @@ if (n != null) { name = n.value(); } - if (!eventControls.containsKey(name)) { + + if (!hasControl(name)) { defineSetting((Class) settingClass, m, type, name); } } @@ -163,7 +180,7 @@ } } aes.trimToSize(); - eventControls.put(settingName, si.settingControl); + addControl(settingName, si.settingControl); eventType.add(PrivateAccess.getInstance().newSettingDescriptor(settingType, settingName, defaultValue, aes)); settingInfos.add(si); } @@ -247,9 +264,9 @@ } void disable() { - for (Control c : eventControls.values()) { - if (c instanceof EnabledSetting) { - c.setValueSafe("false"); + for (NamedControl nc : namedControls) { + if (nc.control instanceof EnabledSetting) { + nc.control.setValueSafe("false"); return; } } @@ -259,24 +276,23 @@ if (!type.isRegistered()) { return; } - for (Map.Entry entry : eventControls.entrySet()) { - Control c = entry.getValue(); - if (Utils.isSettingVisible(c, type.hasEventHook())) { - String value = c.getLastValue(); + ActiveSettingEvent event = ActiveSettingEvent.EVENT.get(); + for (NamedControl nc : namedControls) { + if (Utils.isSettingVisible(nc.control, type.hasEventHook())) { + String value = nc.control.getLastValue(); if (value == null) { - value = c.getDefaultValue(); + value = nc.control.getDefaultValue(); } - ActiveSettingEvent ase = new ActiveSettingEvent(); - ase.id = type.getId(); - ase.name = entry.getKey(); - ase.value = value; - ase.commit(); + event.id = type.getId(); + event.name = nc.name; + event.value = value; + event.commit(); } } } - public Set> getEntries() { - return eventControls.entrySet(); + public ArrayList getNamedControls() { + return namedControls; } public PlatformEventType getEventType() { diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java Fri Jul 12 15:04:28 2019 +0200 @@ -210,10 +210,14 @@ } public synchronized List getEventControls() { - List controls = new ArrayList<>(); + List> eventClasses = jvm.getAllEventClasses(); + ArrayList controls = new ArrayList<>(eventClasses.size() + nativeControls.size()); controls.addAll(nativeControls); - for (EventHandler eh : getEventHandlers()) { - controls.add(eh.getEventControl()); + for (Class clazz : eventClasses) { + EventHandler eh = Utils.getHandler(clazz); + if (eh != null) { + controls.add(eh.getEventControl()); + } } return controls; } @@ -319,4 +323,8 @@ } this.flushMetadata = false; } + + + + } diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java Fri Jul 12 15:04:28 2019 +0200 @@ -58,6 +58,7 @@ public final class PlatformRecorder { + private final List recordings = new ArrayList<>(); private final static List changeListeners = new ArrayList<>(); private final Repository repository; @@ -417,11 +418,10 @@ } private void writeMetaEvents() { - if (activeRecordingEvent.isEnabled()) { + ActiveRecordingEvent event = ActiveRecordingEvent.EVENT.get(); for (PlatformRecording r : getRecordings()) { if (r.getState() == RecordingState.RUNNING && r.shouldWriteMetadataEvent()) { - ActiveRecordingEvent event = new ActiveRecordingEvent(); event.id = r.getId(); event.name = r.getName(); WriteableUserPath p = r.getDestination(); diff -r de154169948b -r 025c9b8eaefd src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java Thu Jul 11 02:21:18 2019 +0200 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java Fri Jul 12 15:04:28 2019 +0200 @@ -33,10 +33,10 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.StringJoiner; +import jdk.jfr.internal.EventControl.NamedControl; import jdk.jfr.internal.handlers.EventHandler; final class SettingsManager { @@ -213,18 +213,21 @@ void setEventControl(EventControl ec) { InternalSetting is = getInternalSetting(ec); - Logger.log(LogTag.JFR_SETTING, LogLevel.INFO, "Applied settings for " + ec.getEventType().getLogName() + " {"); - for (Entry entry : ec.getEntries()) { + boolean shouldLog = Logger.shouldLog(LogTag.JFR_SETTING, LogLevel.INFO); + if (shouldLog) { + Logger.log(LogTag.JFR_SETTING, LogLevel.INFO, "Applied settings for " + ec.getEventType().getLogName() + " {"); + } + for (NamedControl nc: ec.getNamedControls()) { Set values = null; - String settingName = entry.getKey(); + String settingName = nc.name; if (is != null) { values = is.getValues(settingName); } - Control control = entry.getValue(); + Control control = nc.control; if (values != null) { control.apply(values); String after = control.getLastValue(); - if (Logger.shouldLog(LogTag.JFR_SETTING, LogLevel.INFO)) { + if (shouldLog) { if (Utils.isSettingVisible(control, ec.getEventType().hasEventHook())) { if (values.size() > 1) { StringJoiner sj = new StringJoiner(", ", "{", "}"); @@ -241,14 +244,16 @@ } } else { control.setDefault(); - if (Logger.shouldLog(LogTag.JFR_SETTING, LogLevel.INFO)) { + if (shouldLog) { String message = " " + settingName + "=\"" + control.getLastValue() + "\""; Logger.log(LogTag.JFR_SETTING, LogLevel.INFO, message); } } } ec.writeActiveSettingEvent(); - Logger.log(LogTag.JFR_SETTING, LogLevel.INFO, "}"); + if (shouldLog) { + Logger.log(LogTag.JFR_SETTING, LogLevel.INFO, "}"); + } } private InternalSetting getInternalSetting(EventControl ec) {