![]() 前 |
![]() 次 |
図: Javaフライト・レコーダのデータ・フローは、JFR内部でのデータの流れ方を示します。
データは、JVM (内部API経由)およびJavaアプリケーション(フライト・レコーダAPI経由)によってフライト・レコーダに送られます。このデータは、フライト・レコーダ・ランタイムによって小さいスレッドのローカル・バッファに格納され、バッファが一杯になると、グローバルなインメモリー・バッファにフラッシュされます。フライト・レコーダの永続ストレージ・モードでの実行時、グローバルなインメモリー・バッファが一杯になると、バッファ内のデータはディスクに書き込まれます。
様々なバッファ間で情報が重複することはありません。特定のデータ・チャンクはメモリー内またはディスク上のいずれかに格納されます。両方に格納されることはありません。これは次のような意味合いを持ちます:
電力障害が発生した場合、ディスク・バッファにフラッシュされていないデータは使用できません。
JVMがクラッシュすると、データがコア・ファイル(インメモリー・バッファ)とディスク・バッファにわかれて格納される場合があります。フライト・レコーダではこのようなバッファをマージできません(高度なクライアント・プログラムまたはツールではマージ可能な場合もありますが、このバージョンではスコープ外です)。
フライト・レコーダに取り込まれたデータがコンシューマで使用可能になるまでにわずかな遅延が発生する場合があります(たとえば、データは別のバッファに移すことで表示可能になるため)。
JFRファイルのデータは複数のスレッド・バッファのチャンクから収集されるため、時系列に並んでいない可能性があります。
極端な例として、HotSpotがJVMの起動を妨げないようにイベントを削除する場合があります。ディスクへの書込みが間に合わなかったデータはすべて破棄されます。この場合、記録ファイルには影響を受けた期間が記録されます。この情報はJVMのロギング・ファシリティにもロギングされます。