2016-09-22 3 views
2

Java 8 Nashornでサードパーティのコードを実行する必要があるシステムを構築しています。CPUとメモリの使用を監視/制御したいと考えています。私はJavascriptメソッドの前後にアドバイスを追加するByte Buddyエージェントを持っていますが、ループはバイトコードにコンパイルされているため、後ろに行くgotoバイトコードも増やす必要があります。それは現在サポートしているようなものではないようですが、それを実行する能力があると思います。それを使用するか、低レベルのASMコードを書いて自分でそれを行うべきですか?Byte Buddyの "goto"バイトコードにアドバイスを追加するにはどうすればよいですか?

+0

これは、これがbyte-buddyの範囲内であるかどうかわかりません。さらに、すべての後方ブランチを計装することは、実際にあなたがコントロールしようとしているリソースオーバーヘッドを実際に作成するための良いレシピのように聞こえます。 – Holger

+0

影響を制御することができるので、私は一定のオーバーヘッドに気をつけません。これは実際に制御されていないメモリとCPUの使用を止めることです。すべてが少し遅くなることは本当に大きな問題ではありません。 –

答えて

2

私はバイトバディのデベロッパーと私は、メソッドのバイトコード操作のようなものをサポートする予定はありませんし、ここに理由は以下のとおりです。

メソッド内のバイトコードを操作するため、バイトバディは、その根底にあるASMを公開そのような詳細な編集を処理する最良の方法のような(私にとっては)APIです。 Adviceコンポーネントでは、空のオペランドスタックや、メソッドのパラメータ以外のローカル変数のオーバーライド可能なフレームなど、いくつかの前提があります。このため、Adviceコンポーネントがメソッドの前後ではなくメソッド内でトリガーされるようにするのは簡単です。

インプロセスメソッド呼び出しをディスパッチャー呼び出しで置き換えるためのいくつかのコンポーネントを追加することを検討しますが(Javassistsではメソッド内の置換が制限されています)、近い将来にはそうではありません。

+0

ありがとうラファエル!エージェントを構築するときに、ASMにドロップしてクラスを修正するための低レベルのコードを書く最善の方法は何ですか?現在、私はアドバイスをインストールするためにこのようなことをしています: .transform(ビルダー、タイプ、クラスローダー) - > builder.visit(Advice.to(ResourceUsage.class) .on(ElementMatchers.nameStartsWith( ":") ))) –

+0

ありがとうございます。それは今完璧に働いています。 Byte Buddyは素晴らしい図書館です! –

+0

@Rafael:最後の段落は、 'invokedynamic'の自然な使用例のように聞こえます。 – Holger

関連する問題