4 カテゴリ
@Category注釈を使用すると、イベントに任意の数のカテゴリを割り当てることができます。カテゴリは、グラフやツリーなどで一緒に表示する必要がある類似イベントの特定を可能にします。イベントには任意のカテゴリを割り当てられますが(カテゴリは単なる文字列です)、先にカテゴリを決定することをお薦めします。
2つ以上のイベントが同じスレッドで同時に発生することがある場合は、各イベントの開始時間と終了時間が違うとしても、グラフィカル・ユーザー・インタフェースに表示されるときに重ならないよう、カテゴリを分けておく必要があります。
たとえば、Webサーバーへのイメージのアップロードを監視するとします。ユーザーがファイルをアップロードすると開始され、アップロードが完了すると終了する、File Uploadというイベントを作成します。イメージのアップロードをより詳しく診断する場合は、Image Read、Image ResizeおよびImage Writeというより詳細なイベントを作成します。これらの詳細なイベントの発生中、Image Readの際にはSocket Read、Image Writeの際にはFile Writeなど、その他の下位レベルのイベントが発生します。この例では、イベントFile UploadがイベントImage Read、Image ResizeおよびImage Writeと重なっているため、一部のイベント・ビジュアライザでは、詳細なイベントがFile Uploadイベントで見えなくなる場合があります。Image ReadとSocket Read、Image WriteとFile Writeでも同じ問題が起こる可能性があります。
イベントが重ならないよう、重なる可能性があるイベント同士のカテゴリを分けてください。次の図に、イベントが重ならないようにする1つのカテゴリ化スキームと、イベント・ビジュアライザでどのように表示されるかを示します:
図4-1 同時に発生するイベントが重ならないようにするカテゴリ化
File Uploadは、カテゴリUploadに属します。Image Read、Image ResizeおよびImage Writeは、カテゴリImage Uploadに属します。Socket ReadとFile Writeは、カテゴリJava Applicationに属します。
CategoriesSample.java
の例にはこのカテゴリ化スキームが実装されており、図に示されているイベントの作成をシミュレートします:
import jdk.jfr.Category;
import jdk.jfr.DataAmount;
import jdk.jfr.Event;
import jdk.jfr.Label;
import jdk.jfr.Name;
import jdk.jfr.Percentage;
public class CategoriesSample {
public static final String PROGRAMMERS_GUIDE_SAMPLES =
"Programmer's Guide Samples";
public static final String UPLOAD = "Upload";
public static final String IMAGE_UPLOAD = "Image Upload";
public static final String JAVA_APPLICATION = "Java Application";
@Name("com.oracle.FileUpload")
@Label("File Upload")
@Category({PROGRAMMERS_GUIDE_SAMPLES, UPLOAD})
private static class FileUpload extends Event { }
@Name("com.oracle.ImageRead")
@Label("Image Read")
@Category({PROGRAMMERS_GUIDE_SAMPLES, IMAGE_UPLOAD})
private static class ImageRead extends Event {
@DataAmount(DataAmount.BYTES)
long bytesUploaded;
}
@Name("com.oracle.ImageResize")
@Label("Image Resize")
@Category({PROGRAMMERS_GUIDE_SAMPLES, IMAGE_UPLOAD})
private static class ImageResize extends Event {
@Percentage
double scale;
}
@Name("com.oracle.ImageWrite")
@Label("Image Write")
@Category({PROGRAMMERS_GUIDE_SAMPLES, IMAGE_UPLOAD})
private static class ImageWrite extends Event {
@DataAmount(DataAmount.BYTES)
long bytesWritten;
}
@Name("com.oracle.SocketRead")
@Label("Socket Read")
@Category({PROGRAMMERS_GUIDE_SAMPLES, JAVA_APPLICATION})
private static class SocketRead extends Event {
@DataAmount(DataAmount.BYTES)
long bytesRead;
}
@Name("com.oracle.FileWrite")
@Label("File Write")
@Category({PROGRAMMERS_GUIDE_SAMPLES, JAVA_APPLICATION})
private static class FileWrite extends Event {
@DataAmount(DataAmount.BYTES)
long bytesWritten;
}
public static void main(String... args) {
FileUpload fu = new FileUpload();
fu.begin();
ImageRead ir = new ImageRead();
ir.begin();
ir.bytesUploaded = 2048;
SocketRead sr1 = new SocketRead();
sr1.begin();
sr1.bytesRead = 1024;
sr1.commit();
SocketRead sr2 = new SocketRead();
sr2.begin();
sr2.bytesRead = 1024;
sr2.commit();
ir.commit();
ImageResize irs = new ImageResize();
irs.begin();
irs.scale = 0.5;
irs.commit();
ImageWrite iw = new ImageWrite();
iw.begin();
iw.bytesWritten = 1024;
FileWrite fw = new FileWrite();
fw.begin();
fw.bytesWritten = 1024;
fw.commit();
iw.commit();
fu.commit();
}
}
次のコマンドを使用して、CategoriesSample
を実行します:
java -XX:StartFlightRecording:filename=categoriessample.jfr CategoriesSample.java
次に、JDK Mission Controlでcategoriessample.jfr
を開きます。「イベント・ブラウザ」の「イベント・タイプ・ツリー」で、カテゴリProgrammer's Guide Samplesから、このサンプルによって作成されたイベントを探します:
図4-2 CategoriesSampleのイベントが表示されているJDK Mission Controlのブラウザ
JDK Mission Controlでは、@Category
属性に基づいてイベントがカテゴリ化され、@Label
属性ごとにリストされます。