11 イベントしきい値

イベントにしきい値を設定すると、イベントの期間がそのしきい値より短い場合には、Flight Recorderはそのイベントを記録しません。これにより、Flight Recorderで記録するイベントの数を制限できます。デフォルトでは、イベントのしきい値は0ミリ秒です。操作が頻繁に行われ、外れ値が大きな懸念事項である場合には、しきい値の設定をお薦めします。

SetThresholdSample.javaの例では、期間がランダムな10のイベントが作成されます。Flight Recorderは、期間が50ミリ秒を超えるイベントのみを記録します。

import java.util.Random;
import jdk.jfr.Event;
import jdk.jfr.Label;
import jdk.jfr.Name;
import jdk.jfr.Threshold;

public class SetThresholdSample {

    @Name("com.oracle.RandomSleep")
    @Label("Random Sleep")
    @Threshold("50 ms")
    static class RandomSleep extends Event {
        @Label("Event number")
        int eventNumber;
        @Label("Random Value")
        int randomValue;
    }

    public static void main(String... args) throws Exception {
        Random randNum = new Random();
        for (int i = 0; i < 10; i++) {
            RandomSleep event = new RandomSleep();
            event.begin();
            event.eventNumber = i;
            event.randomValue = Math.abs(randNum.nextInt() % 100);
            System.out.println("Event #" + i + ": " + event.randomValue);
            Thread.sleep(event.randomValue);
            event.commit();
        }
    }
}

endメソッドを明示的に呼び出さなくても、commitメソッドがイベントのタイミングで終了することに注意してください。

次のコマンドを使用して、SetThresholdSampleを実行します:

java -XX:StartFlightRecording:filename=st.jfr SetThresholdSample.java
jfr print --events RandomSleep st.jfr

最初のコマンドでは、次のような出力が表示されます:

Event #0: 97
Event #1: 15
Event #2: 25
Event #3: 73
Event #4: 38
Event #5: 11
Event #6: 5
Event #7: 28
Event #8: 42
Event #9: 37

最後のコマンドでは、次のような出力が表示されます:

com.oracle.RandomSleep {
  startTime = 23:17:42.050
  duration = 103.813 ms
  eventNumber = 0
  randomValue = 97
  ...
}

com.oracle.RandomSleep {
  startTime = 23:17:42.197
  duration = 77.726 ms
  eventNumber = 3
  randomValue = 73
  ...
}

shouldCommitメソッド

Event.shouldCommitメソッドは、イベントの期間が指定されたしきい値未満の場合にのみイベントをコミットするため、このメソッドを使用すると負荷のかかる操作のオーバーヘッドを低減できます。

ShouldCommit.javaの例では、期間がランダムな10のイベントが作成されます。Flight Recorderは、期間が20ミリ秒を超えるイベントのみをコミットします。

import java.util.Random;

import jdk.jfr.Event;
import jdk.jfr.Label;
import jdk.jfr.Name;
import jdk.jfr.Threshold;

public class ShouldCommitSample {

    @Name("com.oracle.RandomSleep")
    @Label("Random Sleep")
    @Threshold("20 ms")
    static class RandomSleep extends Event {
        @Label("ID")
        int id;
        @Label("Value Kind")
        String valueKind;
    }

    public static void main(String... args) throws Exception {
        Random randNum = new Random();
        for (int i = 0; i < 10; i++) {
            RandomSleep event = new RandomSleep();
            event.begin();
            event.id = i;
            int value = randNum.nextInt(40);
            System.out.println("ID " + i + ": " + value);
            Thread.sleep(value);
            event.end();
            if (event.shouldCommit()) {
                // Format message outside timing of event
                if (value < 10) {
                    event.valueKind = "It was a low value of " +
                        value + "!";
                } else if (value < 20) {
                    event.valueKind = "It was a normal value of " +
                        value + "!";
                } else {
                    event.valueKind = "It was a high value of " +
                        value + "!";
                }
                event.commit();
            }
        }
    }
}

次のコマンドを使用してこの例を実行します:

java -XX:StartFlightRecording:filename=shouldcommit.jfr ShouldCommit.java
jfr print --events RandomSleep shouldcommit.jfr

最初のコマンドでは、次のような出力が表示されます:

ID 0: 8
ID 1: 2
ID 2: 34
ID 3: 0
ID 4: 11
ID 5: 2
ID 6: 14
ID 7: 28
ID 8: 27
ID 9: 11

最後のコマンドでは、次のような出力が表示されます:

com.oracle.RandomSleep {
  startTime = 23:27:10.642
  duration = 36.711 ms
  id = 2
  valueKind = "It was a high value of 34!"
  ...
}

com.oracle.RandomSleep {
  startTime = 23:27:10.711
  duration = 29.390 ms
  id = 7
  valueKind = "It was a high value of 28!"
  ...
}

com.oracle.RandomSleep {
  startTime = 23:27:10.741
  duration = 28.475 ms
  id = 8
  valueKind = "It was a high value of 27!" 
  ...
}