5

今日、私は 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 ソースを読みましたが、これらは私をさらに混乱させるだけでした。

ある種のリアルタイム バイトコード検証ツール (セキュリティ ツール) を作成しようとしています。

4

1 に答える 1

1

文書化されていないこと - 一部のアイテムがクラスの定数プールで作成され、メソッドに注入される可能性があること。

さて、あなたがリンクした記事には、次のように明確に記載されています。

定数プールには、より多くのエントリまたはより少ないエントリが含まれる場合があります。定数プール エントリの順序は異なる場合があります。ただし、メソッドのバイトコードの定数プール インデックスは対応します。

したがって、実際文書化されています。その理由は、各クラスのバイトコードを正確に覚えておくのは役に立たないため、多くのクラスで同じ定数プール エントリをすべて繰り返すからです。通常、JVM は通常のクラス ファイルとは異なる内部形式を持ち、必要に応じてクラス ファイルを生成します (たとえば、トランスフォーマーを呼び出すとき)。

于 2013-08-26T13:01:01.540 に答える