1. ホーム
  2. java

[解決済み] 同一マシン上で複数のjavaプログラムを実行する場合

2023-03-13 02:28:22

質問

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

  1. もし私がJavaで書かれたWebサービスを持っているならば、それは実行するためにJVMインスタンスを必要とします。

  2. もしそうなら、他のJavaアプリケーションを実行するとき、それはJVMのこのインスタンスを使用するか、または新しいものを作成するのでしょうか?

  3. どのマシンでも利用可能なメインメモリは一定です。初期ヒープサイズを与えずにn個のjavaプロセスを同時に起動した場合、ヒープサイズはどのようにプロセス間で分配されるか?

  4. n個のJVMインスタンスを管理するプロセスはありますか、それともOS自身が管理するのでしょうか?

  5. GC中にstop-the-worldが発生した場合、他のJVMインスタンス(異なるスレッドと思われます)は影響を受けますか?

どのように解決するのですか?

<ブロッククオート

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

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

2) もしイエスなら、他のJavaアプリケーションを実行するとき、それはJVMのこのインスタンスを使用するか、または新しいものを作成しますか?

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

各JVMは独立したプロセスであり、それはスタック、ヒープ、その他を共有しないことを意味します。 (一般的に、共有されるかもしれない唯一のものは、コア JVM およびネイティブ ライブラリのコードを保持する読み取り専用セグメントです...通常のプロセスがコード セグメントを共有するかもしれないのと同じ方法で)。

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

サイズを指定しない場合、ヒープの大きさを決定するメカニズムは、使用している JVM/プラットフォーム/バージョンに依存し、また、(Hotspot JVM のための) "client" または "server" モデルを使用しているかどうかにも依存します。 ヒューリスティックは、他のJVMの数またはサイズを考慮に入れていません。

参考にしてください。 https://stackoverflow.com/a/4667635/139985

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

4) JVMインスタンスのn個を管理するプロセスはありますか、それともOS自身が管理するのでしょうか?

どちらでもありません。 JVMインスタンスの数は、プロセスを開始することができる様々なものの動作によって決定されます。例えば、デーモンスクリプト、コマンドスクリプト、コマンドラインでコマンドをタイプするユーザー、等々です。 最終的に、OSは、リソースが不足した場合、それ以上のプロセスの開始を拒否することができますが、JVMは他のプロセスと異なって扱われることはありません。

5) GC中にstop-the-worldが起こったとき、他のJVMインスタンス(異なるスレッドを想定)は影響を受けるのでしょうか?

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