複数のJavaプログラムが同じマシンで実行されている場合


83

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

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

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

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

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

  5. GC中にstop-the-worldが発生すると、他のJVMインスタンス(私が想定するさまざまなスレッド)が影響を受けますか?


2
最初のポイントは、コンテナーの実装によって異なります...
MadProgrammer 2013

6
詳細な説明と質問する前の質問の調査については、+ 1を参照してください。
amod 2013

回答:


80

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.