すべてのJava実行中のアプリケーションで使用される同じJVMですか、またはJava application 'ごとに1つのJVMが適用されますか?(アプリケーションはIntelliJ IDEA、サーバーおよびNetBeansなど)
さらに、割り当てられたJVMと各Javaアプリケーションで使用されるプロセスとの間に接続はありますか?
一般的に、各アプリケーションは独自のJVMインスタンスと独自のOSレベルプロセスを取得し、各JVMインスタンスは互いに独立しています。
クラスデータ共有 などの実装の詳細がいくつかあります。複数のJVMインスタンスがデータ/メモリを共有する場合がありますが、それらはアプリケーションに対してユーザーから見える影響はありません(起動時間の改善を期待します)。
ただし、一般的なシナリオは、複数のWebアプリケーションを実行するGlassfishやTomcatなどの単一のアプリケーションサーバー(または「Webサーバー」)です。この場合、複数のWebアプリケーションがJVMを共有できます。
Javaアプリケーションごとに1つのJVMがあります。ネットワークなどを使用して接続しない限り、それらの間に接続はありません。IDE内で作業している場合、通常、記述するコードは実行されますIDEは通常、デバッグのために別個のJVMに接続します。複数のWebアプリケーションを扱っている場合、同じWebコンテナにデプロイされていれば同じJVMを共有できます。
理論的には、JVMで複数のアプリケーションを実行できます。実際には、さまざまな方法で互いに干渉する可能性があります。例えば:
The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications.
Any application that calls System.exit() kills all applications.
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too.
実行中のJVMの数は、呼び出された実行可能ファイルの数です。このような各アプリケーションは、独自のJava実行可能ファイル(Windowsの場合はJava.exe/javaw.exe etx))を呼び出します。つまり、それぞれが別個のJVMで実行されています。
簡単な答え:多くの場合、はい、JVMごとに1つのアプリケーションを取得します。長い答え:JVMはそのように使用でき、それが最良のオプションかもしれませんが、そうである必要はありません。
それはすべて、あなたが「アプリケーション」であると考えるものに依存します。 IDEは、単一のエンティティとしてエンドユーザー(つまり私たち)に提示されるアプリケーションの良い例ですが、実際には複数の基礎となるアプリケーション(コンパイラ、テストランナー、静的分析)で構成されますツール、パッケージャー、パッケージマネージャー、プロジェクト/依存関係管理ツールなど)その場合、IDEはユーザーが統合されたエクスペリエンスを体験することを保証するために使用するさまざまなトリックがありますこのようなトリックの1つは、テキストファイルまたはアプリケーションレベルのデバッグ機能を介して通信する別のJVMでsomeを実行することです。
アプリケーションサーバー(Wildfly、Glassfish、Websphere、Weblogicなど)は、実行する他のアプリケーションのコンテナーとして機能することを理由とするアプリケーションです。その場合、1つの観点から、アプリケーションごとに1つのJVM(つまり1つのJVM)がありますアプリケーションサーバー全体を実行するために使用されます)が、実際にはそのJVM内に独自の権利で複数のアプリケーションが含まれており、それぞれが独自のクラスローダーで互いに論理的に分離されています(偶発的なインプロセスクロストークの可能性を減らします)。
したがって、それはすべてあなたがapplication
とみなすものに依存します。 「 'main()'が呼び出されたときに実行されるもの」について純粋に話している場合、JVMごとに1つのアプリケーションを見ています。OSがJVMを起動すると、JVMは単一クラスのpublic static void main()
方法。
しかし、アプリケーションがより複雑になると、境界はよりぼやけます。 IDE(IntellijやEclipseなど)は、同じJVMまたは別のJVMで 'javac'と同じものの多くを再利用するだけでなく、異なる作業(画面の再描画など) )。(共有JVM)アプリケーションサーバー上のWebアプリケーションのユーザーは、実際にはコマンドライン経由でローカルで使用できるものとほぼ同じ「コア」アプリケーションを使用している可能性があります。
共有ライブラリを持つすべてのアプリケーションは、それらのライブラリの同じコピーを共有します。 Javaにはかなりの量の共有ライブラリがあります。ただし、保存されたメモリを除いて違いに気付かないでしょう。
ここでは少し遅れていますが、この情報は誰かに役立つかもしれません。 Linuxシステムでは、実行されているJVMの数を知りたい場合は、このコマンドを試すことができます。
$ ps -ef | grep "[j]ava" | wc -l
ps
はプロセスをリストし、grep
は「Java」を含むプロセスを検索し、wc
は返された行をカウントします