FERRARIとMAJORについての以前のコメントに加えて、いくつか言いたいことがあります。
- どちらのツールも、コンパイル済みの 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 にロードされているかどうかを確認してください。うまく機能するかどうかはわかりません。テストするだけです。