JAva vm小記jit hotspot解釈実行


一.jvmはThe Java Virtual Machine(JVM)loads the class files and either interprets the bytecode or just-in-time compiles it to machine code and then possibly optimizes it using dynamic compilationを実行します.以上の内容はhttp://en.wikipedia.org/wiki/Java_compiler英語のドキュメントからよく書かれています.これは私が長い間見つけた最も包括的なjvmマウントクラスの実行の説明です.JAva仮想マシンはクラスファイルをマウントした後、バイトコードを実行するか、マシンコードに即時にコンパイルするかを説明することで、自動最適化コンパイルを使用する可能性が高い.以上の内容は以下の解釈がある:1.解釈実行は最も初期の実行方式であり、速度が遅い.2.jitは従来の最適化方式でコード実行を加速させるIBMがjitを使用して実行する際の最適化を説明するドキュメントがある:http://www.ibm.com/developerworks/cn/linux/es-JITDiag.html3.java hotspot vmの適応最適化Adaptive optimization sun社が実現した仮想マシンはhotspot vmと命名され、sunは自動最適化コンパイル技術を採用している.1.1解釈実行について
public void getString(){ 
      String a ="a";
} 

//   java bytecode   
0x12 ldc 
  0x15 iload 
  0x4C astore_1 
  0xB1 return 

 以上javacによって生成されたclassのbytecode,javaの既存のbytecodeは202個ある.詳細は、http://java.sun.com/docs/books/jvms/second_edition/html/Mnemonics.doc.html javaは解釈型言語、すなわち中間言語bytecodeにコンパイルされ、jvm実行時にbytecodeがマシンコード実行に解釈される.
1.2 ibm vmのようなjitのjvmを使用して、各文を解釈して実行します.説明を必要とせずに、最初の実行時にコンパイルできますか?そこで、jitによって実行時速度just in timeの定義を最適化するJVM実装者がいます:http://en.wikipedia.org/wiki/Just-in-time_compilation
 
JIT(just-in-time compilation、インスタントコンパイル)とは、コンピュータ分野において、インスタントコンパイルは動的翻訳(dynamic translation)とも呼ばれ、実行時にバイトコードをマシンコードに翻訳することで、バイトコードコンパイル言語性能を改善する技術である.just in timeコンパイル実行と解釈実行の違い:jitはgetStringメソッド全体をコンパイルし、マシンコードを生成し、getString実行を解釈する際にldcを解釈し、対応マシンコードを実行し、iloadを解釈し、対応マシンコードを実行する.そこで,解釈実行には毎回4回の解釈が必要である.某confluence上jit compiler紹介http://www.javaworld.com.tw/confluence/display/JDictionary/JIT+Compiler
1.3 java hotspot vmjava hotspot vmの自動最適化技術従来のjitに基づいてより多くの最適化方法があります:hotspotのoverview:http://java.sun.com/products/hotspot/whitepaper.html#3を参照してください ドキュメントではjitの使用が最適化実行であることを説明し、However,there are several issues with JIT compilationがjitを使用すると解決しにくい問題があることを指摘しています.再度、Secondly,even if a JIT had time to perform full optimizationは、jitを完全に使用して最適化しても、cまたはc++の速度は速くありません.*Java言語は、プログラムの言語の意味に違反しないか、非構造化メモリに直接アクセスする動的なセキュリティです.これは、動的テストが*Java言語で割り当てられたすべてのオブジェクトのスタックを頻繁に行う必要があることを意味しますが、C++の多くはスタック割り当てです.これは、C++オブジェクトの割り当て率がずっと高いことを意味します.また、Java言語はゴミ収集であるため、間接的な費用を割り当てるメモリのタイプが非常に異なります.*  Java言語では、ほとんどが仮想メソッド呼び出し(多分多態性)であり、C++よりもよく使用されます.これは、このメソッド呼び出しのパフォーマンスがより主導的であるだけでなく、静的コンパイラ最適化がより実行しにくいメソッド呼び出しであることを意味する.多くの従来の最適化が最も効果的な要件であり、Java言語での距離要件を削減することで、コードの一部が動作するため、使用効率の最適化を大幅に低減することができます.*Javaテクノロジーに基づくプログラムは、動的に変更され、動的にロードされるクラスです.これはずっと難しい.コンパイラは、これらの最適化が無効になり、動的にロードされたことを検出するだけでなく、スタックに対して積極的に関与している方法であっても、これらの最適化プログラムの実行中に取り消したり、やり直したりすることができます.これは、Javaテクノロジーに基づいたプログラムが損害や影響を及ぼさないように意味を実行する必要があります.最後に、The Java HotSpot VM architecture addresses the Java language performance issues described above by using adaptive optimization technology.Java HotSpot仮想マシンアーキテクチャのJava言語によるパフォーマンス問題の解決前述の適応最適化技術1.4 java hotspot vm特性の利用についてhotspotドキュメントで詳しく説明します.
  • The Java HotSpot Compilers

  •  
  • Overview
  • Hot Spot Detection
  • Method Inlining
  • Dynamic Deoptimization
  • Java HotSpot Client Compiler
  • Java HotSpot Server Compiler
  • Compiler Optimizations

  • Hot spot Detectionホットスポット検出
    プログラムの大部分の時間はわずかなコードを実行しているだけで、すべてをコンパイルする必要はありません.
    hot spot vmは実行コードを解釈し、hot spotキー部分であるかどうかを分析し、もしそうであればglobal natvie code最適化を行う.
    hot spot vmは最も重要なコードに注目し、アセンブリがコードを頻繁に実行しないことを回避し、総アセンブリ時間を増やす必要はありません.
    hot spot vm持続的動的モニタリングのプログラム実行.
    プログラムを1回実行すると、関連情報を収集し、よりスマートな最適化を実行できます.
     
     
    メソッド埋め込みmethod inlining
    仮想メソッド呼び出しはjavaプログラミング言語の重要な最適化ボトルネックである.
    it not only compiles the hot spot into native code, but also performs extensive method inlining on that code.
    vmはローカルコードにコンパイルするだけでなく,呼び出しのコードにメソッドを埋め込む.
     
    内蔵は重要な役割を果たす.動的周波数のメソッド呼び出しを大幅に低減し、これらのメソッド呼び出しを実行するのに要する時間を節約します.さらに重要なのは、埋め込まれたコードが最適化作業を実行できることです.これは、従来のコンパイラ効率の最適化を大幅に増加させ、Javaプログラミング言語の性能を増加させる主な障害を克服する局面をもたらした.組み込みは、他のコードと連携して最適化されます.これは、それらをより効果的にするためです.Java HotSpotコンパイラの成熟したように、将来的にはモジュールを内蔵するコードにはより先進的な最適化技術があります.
     
     
    どうてきさいてきか
    JAva言語の特性により、ホットスポット検出、ダイナミックメソッド呼び出し、クラスファイルの再ロードなど、メソッドの埋め込みがかなり複雑になります.
    したがって、vmが最適化したコードは、コードの変化に伴って動的に変化しなければならない.
    java hotspot Client compilerとjava hotspot server compilerは動的最適化を実行します.
     
    java hotspot client compiler
    クライアントは3段階に分けてコードをコンパイルし、
     
    ステップ1:a platform-independent front end  constructs a high-level intermediate representation (HIR)from the bytecodes
    ステップ2:In the second phase,the platform-specific back end generates a low-level intermediate representation(LIR)from the HIR.
    ステップ3:The final phase performs register allocation on the LIR using a customized version of the linear scan algorithm,does peephole optimization on the LIR and generates machine code from it.
    java hotspot server compiler
    server compiler対応はサーバアプリケーションを最適化します.
    including dead code elimination,loop invariant hoisting,common subexpression elimination,constant propagation,global value numbering,and global code motionを含む多くの最適化技術がある.