8

この記事を読むと、各 Java アプリケーションが特定の Java 仮想マシン インスタンスで実行されることがわかります。したがって、次のコマンド ("Java -jar test1.jar","Java -jar test2.jar") を実行すると、システムに 2 つのプロセスが作成されます。各コマンドがデフォルトのヒープ サイズ (たとえば 256M.合計メモリ コストは 512M ですよね? 他にも質問があります:

  • Java 仮想マシンはデーモン プロセスですか、システムで起動しますか?
  • 「java -jar test1.jar」を実行すると、Java 仮想マシンのインスタンスが作成され、メイン関数が実行されます。実行中のすべての Java アプリケーションが Java 仮想マシンのサブスレッドまたはプロセスであるということですか?
  • 実行中のJavaアプリケーションはそれぞれ個別で、他のアプリケーションはこの実行中のJavaアプリケーションから変数、メソッド、定数などを取得できませんか?
  • 実行中の 1 つの Java アプリケーションがクラッシュした場合、実行中の他の Java アプリケーションに影響はありますか?

PS: 私はググって、たくさんの異なる答えを得ました。私は完全に混乱していました。この種の質問、またはJava仮想マシンのさらに深いところで私を助けることができる人. たとえば、仕組み。

4

3 に答える 3

7

JVM は、他のプロセスと同様に標準的なプロセスです。そのため、両者の間に暗黙の通信や状態共有はありません。それぞれに独自のヒープ、スレッドなどがあります。一方を強制終了しても、もう一方には影響しません。

共有されるのは、JVM 自体のコード ページです。カーネルは、2 回実行されている同じバイナリ (JVM だけでなく任意のバイナリ) を識別し、イメージを再利用するのに十分なほどインテリジェントです。これは実際のバイナリ コードにのみ適用され、その状態には適用されません。詳細については、こちらを参照してください。Linux。

JVM はデーモン プロセスではありませんが、システムの起動時に Windows サービスまたは Unix/Linux プロセス (/etc/init.dスクリプト経由) として起動できます。これは、マシンの起動時に Java で記述された Web サービスを (たとえば) 実行する方法です。

于 2012-09-20T08:45:47.893 に答える
2

1) いいえ。ただし、ラッパーを使用して Java アプリケーションをサービスとして起動する方法はあります (「Java サービス」の場合は Google)。

2) はい。

3) プロセス間通信(vg HTTP)が利用できます。ただし、すべてのプロセスが JVM で実行されるため、近道はありません。

4) いいえ

于 2012-09-20T08:40:40.143 に答える
0

For the OS, JVM like an user application. Each JVM Instance is individual.

  1. いいえ。JVM は他のプロセスと同様に通常のプロセスですが、デーモン プロセスとして実行することもできます。
  2. はい。Java アプリケーションは、OS 上のアプリケーションと同じように JVM 上で実行されます。
  3. はい。各 JVM スレッドは個別ですが、ネットワークや RMI を介して他の JVM と通信できます...
  4. 場合によります。通常、それらは個別ですが、JVM がクラッシュcause the OS crashすると、他の JVM が影響を受けます。
于 2012-09-20T13:18:34.517 に答える