92

各 Java アプリケーションは、特定の Java 仮想マシン インスタンスで実行されます。私は以下の側面で本当に混乱しており、グーグルは私をさらに混乱させています. さまざまなサイトのさまざまな記事。

  1. Java で記述された Web サービスがある場合、JVM インスタンスを実行する必要があります。JVM をデーモン プロセスにすることはできますか?

  2. はいの場合、他の Java アプリケーションを実行するときに、JVM のこのインスタンスを使用するか、新しいインスタンスを作成しますか?

  3. どのマシンでも使用できるメイン メモリは一定です。初期ヒープサイズを指定せずに n 個の Java プロセスを同時に開始すると、ヒープサイズはプロセス間でどのように分散されますか?

  4. n個のJVMインスタンスを管理するプロセスはありますか、それともOS自体によって管理されていますか?

  5. GC 中にストップ・ザ・ワールドが発生すると、他の JVM インスタンス (私が想定する別のスレッド) が影響を受けますか?

4

2 に答える 2

89

1) Java で記述された Web サービスがある場合、実行するには JVM インスタンスが必要です。では、JVM をデーモン プロセスにすることはできますか?

はい、できます。それがどのように行われるかは、O/S と Web サーバー コンテナー自体によって異なります。

2) はいの場合、他の Java アプリケーションを実行するときに、JVM のこのインスタンスを使用するか、新しいインスタンスを作成しますか?

いいえ。各 Java アプリケーションは独立した JVM を使用します。

各 JVM は個別のプロセスです。つまり、スタック、ヒープなどの共有はありません。(通常、共有される可能性があるのは、コア JVM のコードとネイティブ ライブラリを保持する読み取り専用セグメントだけです。通常のプロセスがコード セグメントを共有するのと同じ方法です。)

3) どのマシンでも使用可能なメイン メモリは一定です。初期ヒープサイズを指定せずに n 個の Java プロセスを同時に開始すると、ヒープサイズはプロセス間でどのように分散されますか?

サイズを指定しない場合にヒープの大きさを決定するメカニズムは、使用している JVM / プラットフォーム / バージョン、および "クライアント" モデルまたは "サーバー" モデル (Hotspot JVM の場合) のどちらを使用しているかによって異なります。ヒューリスティックでは、他の JVM の数やサイズは考慮されません。

参考: https ://stackoverflow.com/a/4667635/139985

実際には、ヒープ サイズを直接指定する方がよいでしょう。

4) n 個の JVM インスタンスを管理するプロセスはありますか、それとも OS 自体によって管理されますか?

ない。JVM インスタンスの数は、プロセスを開始できるさまざまなもののアクションによって決まります。たとえば、デーモン スクリプト、コマンド スクリプト、コマンド ラインでコマンドを入力するユーザーなどです。最終的に、OS がリソースを使い果たした場合、OS はそれ以上のプロセスの開始を拒否する可能性がありますが、JVM は他のプロセスと同じように扱われます。

5) GC 中にストップ・ザ・ワールドが発生すると、他の JVM インスタンス (私が想定する別のスレッド) が影響を受けますか?

いいえ。JVM は独立したプロセスです。それらは変更可能な状態を共有しません。ガベージ コレクションは、各 JVM で個別に動作します。

于 2013-08-23T05:12:35.597 に答える
10
  1. Java プログラムをデーモン化する方法を参照してください。
  2. JVMの新しいインスタンスが作成されます
  3. 他のすべてのプロセス間でメモリが共有されるのと同じ方法
  4. O/S によって管理されます。
  5. 他のインスタンスは影響を受けません

インスタンスが作業を調整する必要がある場合は、他のインスタンスを実行/停止する単一のメイン インスタンスを作成できます。

複数の JVM インスタンスが必要な理由を説明していません。おそらく、単一インスタンスの方がうまくいくでしょう。

于 2013-08-23T04:29:26.917 に答える