11

各アプリケーションは独自の JVM で実行されると読みました。なぜそうなのですか?1 つの JVM で 2 つ以上のアプリを実行しないのはなぜですか?

SO の投稿を読みましたが、回答が得られませんでした。 Java アプリケーションごとに 1 つの JVM がありますか?

public static void main(String[]) メソッドを介して起動されたアプリケーションについて話している...)

4

5 に答える 5

33

(メソッドを介して起動されるアプリケーションについて話していると思いますpublic static void main(String[])...)

理論的には、JVMで複数のアプリケーションを実行できます。実際には、それらはさまざまな方法で互いに干渉する可能性があります。例えば:

  • JVMには、1セットSystem.in/out/err、1つのデフォルトのエンコーディング、1つのデフォルトのロケール、1つのシステムプロパティのセットなどがあります。1つのアプリケーションがこれらを変更すると、すべてのアプリケーションに影響します。
  • 呼び出すアプリケーションは、System.exit()すべてのアプリケーションを効果的に強制終了します。
  • 1つのアプリケーションが暴走し、CPUまたはメモリを大量に消費すると、他のアプリケーションにも影響を及ぼします。

要するに、多くの問題があります。人々はこの仕事をするために一生懸命努力しました、しかし彼らは本当に成功したことはありません。その一例がエキドナ図書館ですが、そのプロジェクトは約10年間静かでした。 JNodeは別の例ですが、(実際には)コアJavaクラス(のような)をハッキングすることで「だまされ」 、各アプリケーションは、システムプロパティなどのjava.lang.System独立したバージョンのように見えます1System.in/out/err

1-これ(「proclets」)は、真の「分離」を使用した適切な解決策が保留されている間、暫定的なハックであると想定されていました。しかし、主にJNodeアーキテクチャが「システム」と「ユーザー」のものを分離する明確な方法がない単一のアドレス空間を使用したため、分離サポートは停止しました。そのため、分離APIと一致するAPIを作成することはできましたが、主要な分離機能(分離を完全に強制終了するなど)を実装することは事実上不可能でした。または少なくとも、それは私の見解でした。

于 2012-11-24T07:18:39.557 に答える
6

JVM プリアプリケーションを 1 つ持つ理由は、基本的にアプリケーションごとに OS プロセスを持つのと同じです。アプリケーションごとにプロセスを用意する理由はいくつかあります。

  • アプリケーションのバグによって、同じプロセスを共有している他のアプリケーションのデータがダウンしたり破損したりすることはありません。
  • システム リソースは、プロセスごと、つまりアプリケーションごとに計算されます。
  • プロセスを終了すると、関連するすべてのリソースが自動的に解放されます (アプリケーションはそれ自体をクリーンアップしない可能性があるため、プロセスを共有するとリソース リークが発生する可能性があります)。

Chrome などの一部のアプリケーションはさらに進んで、複数のプロセスを作成して、さまざまなタブやプラグインを分離します。

Java といえば、JVM を共有しない理由は他にもいくつかあります。

  • ヒープ サイズが大きいと、ヒープ スペースのメンテナンス ペナルティが高くなります。複数の小さな独立したヒープを管理しやすくします。
  • JVM で「アプリケーション」をアンロードするのはかなり困難です (アプリケーションが実行されていなくてもメモリ内にとどまるのは、多くの微妙な理由があります)。
  • JVM には、アプリケーションに合わせて調整したい多くのチューニング オプションがあります。

いくつかのケースがありますが、JVM は実際にはアプリケーション間で共有されます。

  • アプリケーション サーバーとサーブレット コンテナー (Tomcat など)。サーバー側 Java 仕様は、共有サーバー JVM と動的ロード/アンロード アプリケーションを考慮して設計されています。
  • CLI アプリケーション用の共有 JVM ユーティリティ (例えば、nailgun )を作成する試みはほとんどありません。

しかし実際には、サーバー側 Java でも、上記の理由から、通常はアプリケーションごとに JVM (または複数) を使用する方が適切です。

于 2012-11-24T07:32:22.937 に答える
3

実行コンテキストを分離するため。

プロセスの1つがハングしたり、失敗したり、セキュリティが侵害されたりしても、他のプロセスは影響を受けません。

ランタイムを個別に設定することも、GCの場合よりも処理する参照が少ないため、GCに役立つと思います。

さらに、なぜそれらすべてを1つのJVMで実行するのでしょうか。

于 2012-11-24T07:18:22.210 に答える
1

JBossのようなJavaアプリケーションサーバーは、1つのJVMで多くのアプリケーションを実行するように設計されています

于 2012-11-24T07:20:13.863 に答える
1

アプリケーションによって異なります。

Waratek は、単一の JVM 内で複数の Java アプリケーションをホストすることを提供します。

于 2012-11-24T07:36:20.340 に答える