今日、私は openjdk 7 で javaagent とインストルメンテーションを使用して、巨大なアプリケーション (アプリを含む jboss サーバーなど) のクラスを調査していました。10 秒ごとにすべてのクラスで retransform を呼び出したので、それらのバイトコードが ClassFileTransformer 実装に取り込まれました。
私の実装では、時間の経過とともにクラスのバイトコードがどのように変化するかを追跡するだけです。まず驚いたのは、フィールドとメソッドの順序、メソッド アクセス修飾子、定数プールの内容などがチェックごとに異なることです。それでも、それは文書化されています。
文書化されていないこと - 一部のアイテムがクラスの定数プールで作成され、メソッドに注入される可能性があること。今のところ、数値 (Long、Double、Float など) で発生することに気付きました。
javap では次のようになります。前:
pool:
...
#17 Float NaNf
method:
#1 fload #17 //NaNf
...
実行時に何かがクラスを変更した後:
pool:
...
#17 Float NaNf
#18 Float NaNf
method:
#1 fload #18 //NaNf <- look, it loads #18 now
他のトランスフォーマーやエージェントが接続されていないことを再確認しました。
JVM が私のバイトコードを同じままにしておくことができないのはなぜですか? そのような最適化/変換についてどこで読むことができますか (または他に何がありますか)? 私は JVM ソースを読みましたが、これらは私をさらに混乱させるだけでした。
ある種のリアルタイム バイトコード検証ツール (セキュリティ ツール) を作成しようとしています。