ディレクティブの記述
このトピックでは、コンパイラ・コントロールのオプションと、それらのオプションからディレクティブを記述するステップについて確認します。
コンパイラ・コントロールのオプション
オプションはコンパイルに対する命令です。オプションは、メソッドに応じた精度を提供します。使用可能なオプションはコンパイラによって異なり、特定の値の型を必要とします。
表2-1 共通オプション
オプション | 説明 | 値の型 | デフォルト値 |
---|---|---|---|
|
|
|
|
|
コンパイルからメソッドを除外します。 |
|
|
|
JVMをデバッグする際、指定したメソッドの開始時に実行を停止するブレークポイントを設定します。 |
|
|
|
JVMをデバッグする際、指定したメソッドの開始時にコンパイルを停止するブレークポイントを設定します。 |
|
|
|
指定したメソッドのみをログに記録します。最初にコマンドライン・オプション |
|
|
|
外部 |
|
|
|
インライン化されるメソッドおよびその場所を出力します。 |
|
|
|
生成されたnmethodを出力します。 |
|
|
|
バックグラウンド・タスクとしてメソッドをコンパイルします。バックグラウンド・コンパイルが終了するまで、メソッドはインタプリタ・モードで実行されます。値 |
|
|
|
対応するグローバル・オプションと同じ |
|
|
|
対応するグローバル・オプションと同じ |
|
|
|
対応するグローバル・オプションと同じ |
|
|
|
すべてのCompileCommandを無視します。 |
|
|
|
メソッド照合基準に基づいて組込みの使用を無効にします。 |
|
デフォルト値なし |
|
メソッド照合基準に基づいてメソッドのインライン化を強制または防止します。インライン・ディレクティブ・オプションの記述を参照してください。 |
|
デフォルト値なし |
表2-2 C2専用オプション
オプション | 説明 | 値の型 | デフォルト値 |
---|---|---|---|
|
低頻度の実行ブランチをホット・パスから移動します。 |
|
|
|
外部 |
|
|
|
使用される組込みメソッドおよびその場所を出力します。 |
|
|
|
パイプライン情報をメソッドごとに追跡します(対応するグローバル・オプションと同様)。低速および高速のデバッグ・ビルドを目的としています。 |
|
|
|
パイプライン情報をメソッドごとに追跡します(対応するグローバル・オプションと同様)。低速および高速のデバッグ・ビルドを目的としています。 |
|
|
|
変数のスピルを追跡します。 |
|
|
|
ベクトル・レジスタ間で並行して計算を実行します。 |
|
|
|
ベクトル・レジスタ間で並行して計算を実行します。これにはJVMのデバッグ・ビルドが必要です。 |
|
|
|
ベクトル化から生成された |
|
|
|
OracleのHotspotのIdeal Graphic Visualizer (IGV)に出力されるコンパイラ・グラフのポイントを指定します。値が高いことは粒度が高いことを意味します。 |
|
|
|
単一のメソッドのコンパイル時に使用するノードの最大数を設定します。 |
|
|
値の型ccstr
はメソッド・パターンです。コンパイラ・ディレクティブのメソッド・パターンの記述を参照してください。
デフォルト・ディレクティブは、コンパイラ・オプションのデフォルト値を提供します。デフォルト・ディレクティブとはを参照してください。
ディレクティブ・ファイルの記述
個々のコンパイラ・ディレクティブは、ディレクティブ・ファイルに記述します。アクティブなディレクティブのスタックに追加できるのはディレクティブ・ファイルのみで、個々のディレクティブは追加できません。
[ //Array of directives
{ //Directive Block
//Directive 1
match: ["java*.*", "oracle*.*"],
c1: {
Enable: true,
Exclude: true,
BreakAtExecute: true,
},
c2: {
Enable: false,
MaxNodeLimit: 1000,
},
BreakAtCompile: true,
DumpReplay: true,
},
{ //Directive Block
//Directive 2
match: ["*Concurrent.*"],
c2: {
Exclude:true,
},
},
]
コンパイラ・ディレクティブの記述
コンパイラ・ディレクティブをディレクティブ・ファイル内に記述する必要があります。ディレクティブ・ファイルに記述する個々のコンパイラ・ディレクティブごとに、次のステップを繰り返します。
{
match: ["java*.*", "oracle*.*"],
c1: {
Enable: true,
Exclude: true,
BreakAtExecute: true,
},
c2: {
Enable: false,
MaxNodeLimit: 1000,
},
BreakAtCompile: true,
DumpReplay: true,
},
-
配列およびオブジェクトでは、後に続く余分なカンマはオプションです。
-
属性は文字列であり、必要に応じて引用符で囲まれます。
-
配列に含まれる要素が1つのみの場合、カッコはオプションです。
{
"match": "*Concurrent.*",
c2: {
"Exclude": true,
}
},
コンパイラ・ディレクティブのメソッド・パターンの記述
ccstr
はメソッド・パターンであり、正確に記述することも、ワイルドカード文字で一般化することもできます。一致度の高いどのJavaコードに、付随するディレクティブ・オプションを適用するか、またはどのJavaコードをインライン化するかを指定できます。
インライン・ディレクティブ・オプションの記述
inline
ディレクティブ・オプションの属性は、接頭辞つきの特殊コマンドを使用したメソッド・パターンの配列を必要とします。これにより、インライン化するメソッド・パターンとインライン化しないメソッド・パターンを指定します。
- ディレクティブの共通ブロック、c1ブロックまたはc2ブロックに、
inline:
と記述します。 - 慎重に順序付けたメソッド・パターンの配列を追加します。最初に一致したメソッド・パターンの接頭辞つきコマンドが実行されます。配列内の残りのメソッド・パターンは無視されます。
+
の接頭辞を付けると、一致するJavaコードのインライン化が強制されます。-
の接頭辞を付けると、一致するJavaコードのインライン化が回避されます。- オプション: インライン化動作を複数のメソッド・パターンに適用する必要がある場合、ステップ1から4を繰り返して、複数の
inline
文を記述します。複数のメソッド・パターンが含まれる単一の配列を記述しないでください。
inline
ディレクティブのオプションを示しています。
inline: ["+java/lang*.*", "-sun*.*"]
inline: "+java/lang*.*"
Enableオプションによる重複の回避
Enable
オプションを使用して、ディレクティブの側面を非表示にし、ディレクティブ間の重複を回避できます。
c1
属性は同一です。[
{
match: ["java*.*"],
c1: {
BreakAtExecute: true,
BreakAtCompile: true,
DumpReplay: true,
DumpInline: true,
},
c2: {
MaxNodeLimit: 1000,
},
},
{
match: ["oracle*.*"],
c1: {
BreakAtExecute: true,
BreakAtCompile: true,
DumpReplay: true,
DumpInline: true,
},
c2: {
MaxNodeLimit: 2000,
},
},
]
次の例は、この望ましくないコード重複をEnable
オプションでどのように解消するかを示しています。Enable
は、ブロック・ディレクティブを非表示にし、それらを比較不可とします。 [
{
match: ["java*.*"],
c1: {
Enable: false,
},
c2: {
MaxNodeLimit: 1000,
},
},
{
match: ["oracle*.*"],
c1: {
Enable: false,
},
c2: {
MaxNodeLimit: 2000,
},
},
{
match: ["java*.*", "oracle*.*"],
c1: {
BreakAtExecute: true,
BreakAtCompile: true,
DumpReplay: true,
DumpInline: true,
},
c2: {
//Unreachable code
},
},
]
通常、最初の一致ディレクティブがメソッドのコンパイルに適用されます。Enable
オプションは、このルールに対する例外を提供します。1つ目または2つ目のディレクティブ内のc1
によって通常コンパイルされるメソッドは、3つ目のディレクティブ内のc1
ブロックによってコンパイルされるようになりました。3つ目のディレクティブのc2
ブロックには到達できません。これは、1つ目および2つ目のディレクティブ内のc2
ブロックが優先されるためです。