src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 52850 f527b24990d7
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51525
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     1
/*
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     4
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    10
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    15
 * accompanied this code).
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    16
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    20
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    23
 * questions.
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    24
 */
b305378a358c 8209915: Fix license headers
mikael
parents: 50745
diff changeset
    25
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    26
package jdk.jfr.internal;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    27
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    28
import java.util.HashMap;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    29
import java.util.List;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    30
import java.util.Map;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    31
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    32
import jdk.jfr.Enabled;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    33
import jdk.jfr.RecordingState;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    34
import jdk.jfr.internal.settings.CutoffSetting;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    35
import jdk.jfr.internal.test.WhiteBox;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    36
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    37
// 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
    38
// 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
    39
// 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
    40
//
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    41
// Instead, the event is only emitted before a recording stops and
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    42
// if that recording has the event enabled.
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    43
//
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    44
// 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
    45
//
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    46
public final class OldObjectSample {
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
    private static final String EVENT_NAME = Type.EVENT_NAME_PREFIX + "OldObjectSample";
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    49
    private static final String OLD_OBJECT_CUTOFF = EVENT_NAME + "#" + Cutoff.NAME;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    50
    private static final String OLD_OBJECT_ENABLED = EVENT_NAME + "#" + Enabled.NAME;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    51
52850
f527b24990d7 8205516: JFR tool
egahlin
parents: 51525
diff changeset
    52
    // Emit if old object is enabled in recording with cutoff for that recording
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    53
    public static void emit(PlatformRecording recording) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    54
        if (isEnabled(recording)) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    55
            long nanos = CutoffSetting.parseValueSafe(recording.getSettings().get(OLD_OBJECT_CUTOFF));
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    56
            long ticks = Utils.nanosToTicks(nanos);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    57
            JVM.getJVM().emitOldObjectSamples(ticks, WhiteBox.getWriteAllObjectSamples());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    58
        }
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
    // Emit if old object is enabled for at least one recording, and use the largest
52850
f527b24990d7 8205516: JFR tool
egahlin
parents: 51525
diff changeset
    62
    // cutoff for an enabled recording
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    63
    public static void emit(List<PlatformRecording> recordings, Boolean pathToGcRoots) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    64
        boolean enabled = false;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    65
        long cutoffNanos = Boolean.TRUE.equals(pathToGcRoots) ? Long.MAX_VALUE : 0L;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    66
        for (PlatformRecording r : recordings) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    67
            if (r.getState() == RecordingState.RUNNING) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    68
                if (isEnabled(r)) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    69
                    enabled = true;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    70
                    long c = CutoffSetting.parseValueSafe(r.getSettings().get(OLD_OBJECT_CUTOFF));
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    71
                    cutoffNanos = Math.max(c, cutoffNanos);
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
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    74
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    75
        if (enabled) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    76
            long ticks = Utils.nanosToTicks(cutoffNanos);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    77
            JVM.getJVM().emitOldObjectSamples(ticks, WhiteBox.getWriteAllObjectSamples());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    78
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    79
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    80
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    81
    public static void updateSettingPathToGcRoots(Map<String, String> s, Boolean pathToGcRoots) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    82
        if (pathToGcRoots != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    83
            s.put(OLD_OBJECT_CUTOFF, pathToGcRoots ? "infinity" : "0 ns");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    84
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    85
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    86
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    87
    public static Map<String, String> createSettingsForSnapshot(PlatformRecording recording, Boolean pathToGcRoots) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    88
        Map<String, String> settings = new HashMap<>(recording.getSettings());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    89
        updateSettingPathToGcRoots(settings, pathToGcRoots);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    90
        return settings;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    91
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    92
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    93
    private static boolean isEnabled(PlatformRecording r) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    94
        Map<String, String> settings = r.getSettings();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    95
        String s = settings.get(OLD_OBJECT_ENABLED);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    96
        return "true".equals(s);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    97
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents:
diff changeset
    98
}