下層から着手して、バイトコードの強化とBtraceの応用を解析します

2809 ワード

この文章はバイトコードと関連するアプリケーションについて話します.
1、マシンコードとバイトコード
マシンコード(machine code)は、学名マシン言語命令であり、原生コード(Native Code)とも呼ばれ、コンピュータのCPUが直接解読できるデータである.
通常の意味で理解すると、マシンコードはコンピュータが直接実行でき、実行速度が最も速いコードです.
マシン言語でプログラムを記述するには、プログラマはまず使用するコンピュータのすべての命令コードとコードの意味を熟知しなければならない.プログラミングを手がける場合、プログラマは各命令と各データのストレージ割り当てと入出力を自分で処理し、プログラミング中に各ステップで使用されるワークユニットがどのような状態にあるかを覚えなければなりません.これは非常に煩雑な仕事であり、プログラムの作成にかかる時間は実際の実行時間の数十倍または数百倍であることが多い.また,作成したプログラムはすべて0と1の命令コードであり,直感性が悪く,エラーも発生しやすい.
バイトコード(Bytecode)は、実行プログラムを含み、一連のopコード/データペアからなるバイナリファイルである.バイトコードは、マシンコードよりも抽象的であり、直訳器が翻訳されてからマシンコードの中間コードになる必要がある中間コードである.
通常はコンパイルされていますが、特定のマシンコードとは関係ありません.バイトコードは通常、ソースコードのように読めるものではなく、符号化された数値定数、参照、命令などからなるシーケンスである.
バイトコードは、主に、ハードウェア環境に関係なく、特定のソフトウェア実行およびソフトウェア環境を実現するために使用される.バイトコードの実現方式は、コンパイラと仮想マシンを介して行われる.コンパイラはソースコードをバイトコードにコンパイルし,特定のプラットフォーム上の仮想マシンはバイトコードを直接実行可能な命令に変換する.
バイトコードの典型的な応用はJava bytecodeである.バイトコードは、実行時にJVM(JAVA仮想マシン)を一度に変換してマシン命令を生成するので、よりプラットフォーム間で実行することができます.
2、バイトコード強化技術
Javaバイトコードの強化とは、Javaバイトコードの生成後に、アプリケーションのバイナリファイルを修正することに相当する修正を行い、その機能を強化することを意味します.Javaバイトコードの強化は主に冗長コードを減らし,性能を向上させるためである.
バイトコードの拡張を実現する主なステップは、次のとおりです.
(1)バイトコードの修正
メモリに元のバイトコードを取得し、ASM、Javaasistなどのツールでbyte[]配列を変更して、新しいbyte配列を取得します.
(2)修正後のバイトコードを有効にする
2つの方法があります.
  • ClassLoaderをカスタマイズして、修正されたバイトコードをロードします.
  • 元のバイトコードを置換:JVMがユーザーのClassをロードする時、ブロックして、修正したバイトコードを返します;または実行時にInstrumentationを使用する.redefineClassesメソッドは、元のバイトコードを置き換えます.

  • 3、バイトコードの強化はどのような実現がありますか
    バイトコード拡張テクノロジーには、次のものがあります.
  • 動的エージェント
  • CGLIB
  • Javassist
  • asm

  • ASMを例にとると、クラス、メソッドを動的に変更したり、クラスを再定義したりすることができ、CGLibの下部でもASMで実現されます.
    4、Btrace原理と応用
    BTraceはSUN Kenaiクラウドコンピューティング開発プラットフォームの下のオープンソースプロジェクトであり、javaに安全で信頼性の高い動的追跡分析ツールを提供することを目的としている.
    では、BTraceのような不思議な機能はどのように実現されているのでしょうか.これがオープンソースのコードである以上、コードから直接原理を探します.BTraceコードのオープンソースはhttps://github.com/btraceio/b...である.
    BTraceは、動的バイトコード修正技術(Hotswap)に基づいて、ランタイムjavaプログラムの追跡および置換を実現する.一般的な原理は以下の式で説明できる.
    Client(Java compile api + attach api) + Agent(       + ASM + JDK6 Instumentation) + Socket
    

    BTrace動作シーケンス図は以下の通りである.
    BTraceとは、ASMを使用して現在のクラスを修正し、デバッグ情報を付加して新しいクラスを得ることであり、一般的にClassファイルはjavacコンパイラによって生成され、クラスローダによって仮想マシンにロードされ、エンジンによって実行される.ASMのAPIを介してJava仮想マシンの仕様に合致するClassバイトストリームを直接生成できるようになりました.これにより、ASMが行うことはjavac解釈器が行う仕事である程度です.
    5、まとめ
    バイトコード強化技術は、実行中のプログラムを動的に変更したり、JVM実行中のプログラムの状態を追跡したりすることができる.また,我々が普段使用している動的エージェント,AOPもバイトコード強化と密接に関連しており,実質的には様々な手段を用いて仕様に合致するバイトコードファイルを生成している.
    バイトコードの強化を把握すると、オンラインパフォーマンスの問題、方法の制御不能な出入りパラメータの緊急ログの必要性など、難しい問題を効率的に位置決めし、迅速に修復することができます.また、開発中に冗長コードを削減し、開発効率を大幅に向上させることができます.
    公衆番号に注目:アーキテクチャ進化論、第一手の技術情報とオリジナル文章を得る