各アプリケーションは独自の JVM で実行されると読みました。なぜそうなのですか?1 つの JVM で 2 つ以上のアプリを実行しないのはなぜですか?
SO の投稿を読みましたが、回答が得られませんでした。 Java アプリケーションごとに 1 つの JVM がありますか?
public static void main(String[]) メソッドを介して起動されたアプリケーションについて話している...)
各アプリケーションは独自の JVM で実行されると読みました。なぜそうなのですか?1 つの JVM で 2 つ以上のアプリを実行しないのはなぜですか?
SO の投稿を読みましたが、回答が得られませんでした。 Java アプリケーションごとに 1 つの JVM がありますか?
public static void main(String[]) メソッドを介して起動されたアプリケーションについて話している...)
(メソッドを介して起動されるアプリケーションについて話していると思いますpublic static void main(String[])
...)
理論的には、JVMで複数のアプリケーションを実行できます。実際には、それらはさまざまな方法で互いに干渉する可能性があります。例えば:
System.in/out/err
、1つのデフォルトのエンコーディング、1つのデフォルトのロケール、1つのシステムプロパティのセットなどがあります。1つのアプリケーションがこれらを変更すると、すべてのアプリケーションに影響します。System.exit()
すべてのアプリケーションを効果的に強制終了します。要するに、多くの問題があります。人々はこの仕事をするために一生懸命努力しました、しかし彼らは本当に成功したことはありません。その一例がエキドナ図書館ですが、そのプロジェクトは約10年間静かでした。 JNodeは別の例ですが、(実際には)コアJavaクラス(のような)をハッキングすることで「だまされ」 、各アプリケーションは、システムプロパティなどのjava.lang.System
独立したバージョンのように見えます1。System.in/out/err
1-これ(「proclets」)は、真の「分離」を使用した適切な解決策が保留されている間、暫定的なハックであると想定されていました。しかし、主にJNodeアーキテクチャが「システム」と「ユーザー」のものを分離する明確な方法がない単一のアドレス空間を使用したため、分離サポートは停止しました。そのため、分離APIと一致するAPIを作成することはできましたが、主要な分離機能(分離を完全に強制終了するなど)を実装することは事実上不可能でした。または少なくとも、それは私の見解でした。
JVM プリアプリケーションを 1 つ持つ理由は、基本的にアプリケーションごとに OS プロセスを持つのと同じです。アプリケーションごとにプロセスを用意する理由はいくつかあります。
Chrome などの一部のアプリケーションはさらに進んで、複数のプロセスを作成して、さまざまなタブやプラグインを分離します。
Java といえば、JVM を共有しない理由は他にもいくつかあります。
いくつかのケースがありますが、JVM は実際にはアプリケーション間で共有されます。
しかし実際には、サーバー側 Java でも、上記の理由から、通常はアプリケーションごとに JVM (または複数) を使用する方が適切です。
実行コンテキストを分離するため。
プロセスの1つがハングしたり、失敗したり、セキュリティが侵害されたりしても、他のプロセスは影響を受けません。
ランタイムを個別に設定することも、GCの場合よりも処理する参照が少ないため、GCに役立つと思います。
さらに、なぜそれらすべてを1つのJVMで実行するのでしょうか。
JBossのようなJavaアプリケーションサーバーは、1つのJVMで多くのアプリケーションを実行するように設計されています
アプリケーションによって異なります。
Waratek は、単一の JVM 内で複数の Java アプリケーションをホストすることを提供します。