src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java
author egahlin
Mon, 25 Jun 2018 02:07:42 +0200
changeset 50745 a390cbb82d47
child 51525 b305378a358c
permissions -rw-r--r--
8203929: Limit amount of data for JFR.dump Reviewed-by: mgronlun
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     1
package jdk.jfr.internal;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     2
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     3
import java.util.HashMap;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     4
import java.util.List;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     5
import java.util.Map;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     6
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     7
import jdk.jfr.Enabled;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     8
import jdk.jfr.RecordingState;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
     9
import jdk.jfr.internal.settings.CutoffSetting;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    10
import jdk.jfr.internal.test.WhiteBox;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    11
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    12
// The Old Object event could have been implemented as a periodic event, but
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    13
// due to chunk rotations and how settings are calculated when multiple recordings
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    14
// are running at the same time, it would lead to unacceptable overhead.
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    15
//
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    16
// Instead, the event is only emitted before a recording stops and
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    17
// if that recording has the event enabled.
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    18
//
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    19
// This requires special handling and the purpose of this class is to provide that
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    20
//
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    21
public final class OldObjectSample {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    22
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    23
    private static final String EVENT_NAME = Type.EVENT_NAME_PREFIX + "OldObjectSample";
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    24
    private static final String OLD_OBJECT_CUTOFF = EVENT_NAME + "#" + Cutoff.NAME;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    25
    private static final String OLD_OBJECT_ENABLED = EVENT_NAME + "#" + Enabled.NAME;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    26
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    27
    // Emit if old object is enabled in recoding with cutoff for that recording
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    28
    public static void emit(PlatformRecording recording) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    29
        if (isEnabled(recording)) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    30
            long nanos = CutoffSetting.parseValueSafe(recording.getSettings().get(OLD_OBJECT_CUTOFF));
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    31
            long ticks = Utils.nanosToTicks(nanos);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    32
            JVM.getJVM().emitOldObjectSamples(ticks, WhiteBox.getWriteAllObjectSamples());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    33
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    34
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    35
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    36
    // Emit if old object is enabled for at least one recording, and use the largest
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    37
    // cutoff for an enabled recoding
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    38
    public static void emit(List<PlatformRecording> recordings, Boolean pathToGcRoots) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    39
        boolean enabled = false;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    40
        long cutoffNanos = Boolean.TRUE.equals(pathToGcRoots) ? Long.MAX_VALUE : 0L;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    41
        for (PlatformRecording r : recordings) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    42
            if (r.getState() == RecordingState.RUNNING) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    43
                if (isEnabled(r)) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    44
                    enabled = true;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    45
                    long c = CutoffSetting.parseValueSafe(r.getSettings().get(OLD_OBJECT_CUTOFF));
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    46
                    cutoffNanos = Math.max(c, cutoffNanos);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    47
                }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    48
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    49
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    50
        if (enabled) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    51
            long ticks = Utils.nanosToTicks(cutoffNanos);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    52
            JVM.getJVM().emitOldObjectSamples(ticks, WhiteBox.getWriteAllObjectSamples());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    53
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    54
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    55
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    56
    public static void updateSettingPathToGcRoots(Map<String, String> s, Boolean pathToGcRoots) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    57
        if (pathToGcRoots != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    58
            s.put(OLD_OBJECT_CUTOFF, pathToGcRoots ? "infinity" : "0 ns");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    59
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    60
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    61
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    62
    public static Map<String, String> createSettingsForSnapshot(PlatformRecording recording, Boolean pathToGcRoots) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    63
        Map<String, String> settings = new HashMap<>(recording.getSettings());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    64
        updateSettingPathToGcRoots(settings, pathToGcRoots);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    65
        return settings;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    66
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    67
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    68
    private static boolean isEnabled(PlatformRecording r) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    69
        Map<String, String> settings = r.getSettings();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    70
        String s = settings.get(OLD_OBJECT_ENABLED);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    71
        return "true".equals(s);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    72
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    73
}