5

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

編集::

ですから、もう少しコンテキストを提供するために、私がやろうとしているのはJDKをインストルメント化することです。そしてこれは、すべてのLOAD、STORE、INVOKEバイトコード命令を記録する本格的なインストルメンテーションです。命令が実行されると、それらのデータはxbootclasspathからロードされる静的メソッドに送信されます。この静的メソッドは、このすべての情報をキャプチャし、後で分析を実行するためのトレースとしてこれらすべてを保存します。

さて、これをJDKに対して行うとき、クラスがJVMにロードされる方法を邪魔したくありません。これにより、プログラムがクラッシュする可能性があります。それを実行する最善の方法は、JVMのブートストラップが完了した時点を検出することであると推測していました。これにより、後でインストルメンテーションを安全にオンにできます。(ブートストラップが行われている間は、コードをインストルメント化しない予定です。)これは正しい方法でさえありますか?

4

1 に答える 1

2

FERRARIMAJORについての以前のコメントに加えて、いくつか言いたいことがあります。

  • どちらのツールも、コンパイル済みの Java JAR アーカイブとしてダウンロードする場合にのみ利用できます。
  • そこで、今日これらのツールを作成した科学者に手紙を書き、質問しました。回答が得られ次第、ここで報告します。
  • とにかく、私はFERRARIのアーキテクチャを調べて、彼らがどのようにそれを行っているかを見つけたかもしれないと思う.

だからここにあなたができることについての私の経験に基づいた推測(まだテストされていない)があります:

  • JDK クラスを計測します。
  • BootstrapLock以下で説明するように、単純なクラスを 1 つ追加します。
  • インストルメント化された + 新しいクラスを変更されたrt.jarに再​​パックします。
  • 以下に説明するように、少しダミーのJava エージェントを作成します。
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 の著者の 1 人が私の問い合わせに回答し、上記の説明を確認しました。Java エージェントは、JVM がブートストラップを完了したことを示すマーカーとして使用できます。追加のクラスは必要ないかもしれませんが、エージェントがまだ JVM にロードされているかどうかを確認してください。うまく機能するかどうかはわかりません。テストするだけです。

于 2012-09-01T15:17:50.640 に答える