2012-06-27 8 views
5

JVMのブートストラップフェーズの終了を検出する方法はありますか?JVMのブートストラップフェーズの終了を検出します

編集::

ので、もう少しコンテキストを提供するために、私は何をしようとしていることは機器にJDKです。これは、すべてのLOAD、STORE、INVOKEバイトコード命令を記録する完全な吹き出し型のインストルメンテーションです。命令が実行されると、そのデータはxbootclasspathからロードされた静的メソッドに送られます。この静的メソッドはこのすべての情報を取得し、後で分析を実行するためのトレースとしてこのすべてを格納します。

今、私がJDKでこれを行うとき、私はクラスがJVMにロードされる方法を妨げたくないので、プログラムがクラッシュする可能性があります。私はそれを実行する最善の方法は、JVMがブートストラップを終えた時点を検出することだと推測していたので、その後私は安全に機器を有効にすることができます。 (ブートストラップが行われている間、私はコードのいずれかを計器に入れないことを計画しています。)これは正しいことですか?

+0

まだ読み込まれていないJavaコードの中にあるのですか?または外部プログラムから?ロード/プロファイリング用ですか? –

+4

JVMは遅延ロードであるため、これは実際には発生しません。シャットダウン時に最初にロードされるクラスを持つことができます。 –

+0

@PeterLawrey rt.jarのコアクラスについてはそうですか? –

答えて

2

、私はいくつかのことを言いたいFERRARIMAJORに探してについての私の以前のコメントに加えて:

  • どちらのツールは、コンパイルされたJavaのJARアーカイブとしてダウンロードのみ利用可能です。
  • 私は今日、それらのツールを作った科学者に書いて、質問しました。私が答えを受け取るとすぐに私はここに報告します。
  • とにかく、私はフェラーリのアーキテクチャーを見て、自分がどのようにそれをするのかを知っているかもしれないと思っています。

    • インストゥルメントあなたのJDKクラス:だからここ

    は、あなたが何ができるかについての私の推測(まだ未テスト)です。

  • 以下に説明するように、単純なクラスBootstrapLockを1つ追加します。
  • インスツルメントされた+新しいクラスを修正済みrt.jarに再パックします。
  • 以下に説明するように少しのダミーJava agentを書きます。

    • エージェントは、メインアプリケーションクラスの前にロードされますが、ブートストラップの後に次のよう
    public class BootstrapLock { 
        private static volatile boolean inBootstrap = true; 
    
        public static boolean inBootstrap() { 
         return inBootstrap; 
        } 
    
        public static synchronized void setEndOfBS() { 
         inBootstrap = false; 
        } 
    } 
    
    public class DummyAgent { 
        public static void premain(String options, Instrumentation ins) { 
         BootstrapLock.setEndOfBS(); 
        } 
    } 
    

    だから基本的に論理があります。

  • したがって、エージェントがアクティブであるという事実は、ブートストラップが完了したことを意味します。
  • したがって、エージェントはグローバルマーカーinBootstrapをオフに切り替えることができます。
  • 計装されたクラスは、追加の計測コードをバイパスするかどうかを判断するためにマーカーをチェックできます。

もそれに見て、いくつかのフィードバックを提供することができ、Vijai私はすぐにこのいつでもテストするために十分な時間を持っている場合、私はわからないですが、少なくとも私はそう多分、ここでこの答えを投稿したかったです。 4つの目は2つ以上を見る...


更新:FERRARI作者の一つは、私の問い合わせに答えて上記の私の説明を確認しています。ブートストラップを終了したJVMのマーカーとしてJavaエージェントを使用することができます。たぶんクラスを追加する必要はないかもしれませんが、エージェントがJVMにまだロードされているかどうかだけを確認してください。それは事をさらに簡単にするでしょう、私はそれがうまくいくかどうかわかりません。ちょうどそれをテストします。

+0

しかし、エージェントがロードされていても、ブートストラップが完了していることを保証するのはなぜですか?おそらく私はここに何か基本的なものを見逃している。しかし、答えに感謝! – vijay

+1

より正確に言えば、クラスローディングには接続されず、エージェントの 'premain'メソッドを呼び出すことになります。このメソッドが呼び出されると、あらゆる種類のJVMコードを呼び出すことができます。これはフェラーリの人たちが言うことです。私が書いたことを「基本的に論理は以下の通りです。 – kriegaex

+0

これは今よりはっきりしているようですが、最終的な疑いがあります.JVMコードはどういう意味ですか?一旦premainが呼び出されると、私の計測コードを実行してもJVMがクラッシュすることはないと思いますか? – vijay

関連する問題