Java仮想マシン(二)--java仮想マシンの役割と重要な構成部分


前述したように、Java仮想マシン(JVMと略称する)も、cまたはc++またはアセンブリによって作成されたプラットフォームに関連するプログラムにすぎません.
実際、java仮想マシン仕様の多くは、広く抽象的なルールです.これは、より多くのハードウェア/オペレーティングシステムが自分の仮想マシンプログラムを自由に実現できるようにするためです.結局、ハードウェア環境/オペレーティングシステムは千差万別だからです.
独自の仮想マシンプログラムを実現する際には、仮想マシン仕様の原則に合致する限り、他のjavaプログラムが新しい仮想マシンプラットフォームに順調に移行することを保証します.同時に、仮想マシンの作成者に大きな発揮空間を与えます.
実行時のjava仮想マシンインスタンスの天職は、javaプログラムを実行することです.Javaプログラムが開始されると、仮想マシンのインスタンスが誕生します.このプログラムの実行が完了すると、仮想マシンインスタンスは消滅します.
1台のコンピュータでjavaプログラムが3つ同時に実行されている場合、3つの仮想マシンインスタンスがそれぞれ実行されます.
JVMがinitial classのmain()から実行するjavaプログラムの実行を開始します.そのため、仮想マシン、initial classの名前をimplementation-dependent wayで伝えなければなりません.
たとえば、Echoというjavaプログラムを実行します.
java Echo Greetings, planet 
JAvaはオペレーティングシステムが実行すべきjava仮想マシンの名前で、現在実行されている仮想マシンプログラムを具体的に見ます.Echoはinitial classであり、main()を含まなければならない.残りはプログラムの入力パラメータです.
次の言葉は大切だ
Inside the Java virtual machine, threads come in two flavors:daemon and non-daemon.
JVM内部には、デーモンスレッドと非デーモンスレッドの2つのスレッドがあります.デーモンスレッドは、通常、ゴミ回収用のスレッドなど、仮想マシンが独自に使用するスレッドです.アプリケーションは任意のスレッドをデーモンスレッドとしてマークできますが、main()が存在するスレッドは非デーモンスレッドのみです.プログラムの非デーモンスレッドが終了すると、デーモンスレッドは終了します.
仮想マシンの構成
前述したようにjavaプログラムの実行時には、仮想マシンのclass loaderがclassファイルを仮想マシンのデータ構造にloadし、その後、実行エンジン(execution engine)が実行する.
そこで次にお話しするのはclass loader,java API,javaプログラム言語です.次のセクションでは、仮想マシンのデータ構造について説明します.
Class Loader
Class loaderは仮想マシンのサブシステムです.実際、1つの仮想マシンに複数のclass loaderがあり、次のように分けることができます.
1,起動(bootstrap)class loader--仮想マシンに必要な固有の部分.仮想マシンがc言語で記述されている場合は、c言語で記述する必要があります.このclass loaderはJVM起動時にjavaコアAPIをロードし、javaプログラムの最も基本的なニーズを満たす.
ユーザー定義のclass loaderもロードされます.
2、ユーザー定義class loader--オプション.ユーザーカスタムclass loaderはjavaによって作成され、classファイルにコンパイルするプログラムが必要です.loadはjava仮想マシンに入り、他のクラスのようにインスタンス化されます.
ユーザー定義のclass loaderは、ExtClassLoaderとAppClassLoaderの2つに分類されます.
ExtClassLoaderはjavaの拡張APIをロードするために使用されます.
AppClassLoaderは、ユーザーマシン上のclasspath指定ディレクトリのclassファイルまたはjarパッケージ、すなわちプログラマがカスタマイズしたクラスをロードするために使用されます.
プログラムを実行すると、JVMが起動し、bootstrap class loaderを実行します.このclass loaderはjavaコアAPIをロードし、ExtClassLoaderとAppClassLoaderをロードします.次にExtClassLoaderを呼び出して拡張APIをロードし、最後にAppClassLoaderはプログラマカスタムクラスをロードします.
ユーザー定義class loaderを使用する意味は、次のとおりです.
1, User-defined class loader senable you to dynamically extend a Java application at run-time. 
2、安全性
For example, if the virtual machine loads class Volcano through a particular class loader, it will attempt to loadany classes Volcano refers to through the same class loader.デフォルトでは、同じclass loaderでロードされたクラスのみが互いに表示されます.この動作により、単一のプログラムで複数のname-spaceを形成することができます.
When you write a Java application, you can segregate classes loaded from different sources into different name-spaces. In this way,you can use Java's class loader architecture to control any interaction between code loaded from different sources.
典型的な例:
動的拡張の一例は、インターネットからダウンロードされた複数のclassファイルを複数のユーザ定義class loaderを使用してマウントするウェブブラウザです.
なぜなら、どのclassファイルがダウンロードされる必要があるかは、java appletsコードを含むページが開かれ、実行時に一時的に決定されるからです.
ブラウザ(javaプログラム)は、最初はインターネットからどのclassファイルをダウンロードするか分かりませんでした.
通常、ブラウザのjavaプログラムは、ダウンロードする必要があるclassファイルアドレスごとにuser-defined class loaderを作成します.
このように、各sourceからのclassファイルは、自分のuser-defined class loaderにのみ存在し、ソースのclassに悪意のあるコードが含まれている場合、他のソースのclassにも影響を与えることはできません.
Class file
classファイルは主にプラットフォームの無関係性とネットワークの移動性の面でjavaをネットワークに適応させる.JAva仮想マシンはプラットフォームに関連しており、その上のclassファイルはプラットフォームに関係ありません.
同時にclassファイルはコンパクトに設計されているので、ネットワーク上で迅速に転送できます.次にjavaプログラムはダイナミック接続とダイナミック拡張のためclassファイルは必要なときにダウンロードできます.これにより、端末ユーザの待ち時間を最小限に抑えることができる.
Java API
JAva APIは、ホストシステムリソースにアクセスするための標準的な方法を提供するライブラリを実行する集合です.Javaプログラムを作成する場合、実行可能なプログラムのJVM上でjava API classファイル(javaプログラムを実行するために必要なJRE)を取得できると仮定できます.
すべてのマウントされたclassファイル(アプリケーションからマウントされたclassファイルとjava apiからマウントされたclassファイルを含む)とすべてのマウントされたダイナミックライブラリ(ローカルメソッドを含む)は、JVM上で実行されるプログラム全体を構成します.
Javaプログラムでは、プラットフォーム内部にかかわらず、java APIは同じ表現と予測可能な動作をします.特定のホストプラットフォームごとにjava仮想マシンとjava APIが明確に実現されているからこそ、javaプログラムはプラットフォームの無関係性を備えたプログラムとなる.