Wenn mehrere Java-Programme auf demselben Computer ausgeführt werden

81

Jede Java-Anwendung wird in einer bestimmten Java Virtual Machine-Instanz ausgeführt. Ich bin in den folgenden Aspekten wirklich verwirrt und Googeln hat mich noch mehr verwirrt. Verschiedene Artikel auf verschiedenen Seiten.

  1. Wenn ich einen in Java geschriebenen Webdienst habe, muss zum Ausführen eine JVM-Instanz ausgeführt werden. Kann JVM also zu einem Daemon-Prozess gemacht werden?

  2. Wenn ja, wenn wir eine andere Java-Anwendung ausführen, wird diese Instanz von JVM verwendet oder eine neue erstellt?

  3. Der in jeder Maschine verfügbare Hauptspeicher ist konstant. Wenn wir n Java-Prozesse gleichzeitig starten, ohne eine anfängliche Heap-Größe anzugeben, wie verteilt sich die Heap-Größe auf die Prozesse?

  4. Gibt es einen Prozess, der n JVM-Instanzen verwaltet, oder wird er vom Betriebssystem selbst verwaltet?

  5. Wenn Stop-the-World während eines GC passiert, sind andere JVM-Instanzen (andere Threads, nehme ich an) betroffen?

Aniket Thakur
quelle
2
Ihr erster Punkt hängt von der Implementierung des Containers ab ...
MadProgrammer
6
+1 für eine detaillierte Erklärung und Recherche der Frage, bevor Sie fragen.
Amod

Antworten:

78

1) Wenn ich einen in Java geschriebenen Webdienst habe, muss eine JVM-Instanz ausgeführt werden. Kann JVM also zu einem Daemon-Prozess gemacht werden?

Ja, kann es. Wie es gemacht wird, hängt vom Betriebssystem und vom Webserver-Container selbst ab.

2) Wenn ja, wenn wir eine andere Java-Anwendung ausführen, wird diese Instanz von JVM verwendet oder eine neue erstellt?

Nein. Jede Java-Anwendung verwendet eine unabhängige JVM.

Jede JVM ist ein separater Prozess, und das bedeutet, dass keine Stapel, Haufen usw. gemeinsam genutzt werden. (Im Allgemeinen können nur die schreibgeschützten Segmente gemeinsam genutzt werden, die den Code der JVM-Kernbibliothek und der nativen Bibliotheken enthalten ... genauso wie normale Prozesse Codesegmente gemeinsam nutzen können.)

3) Der in jeder Maschine verfügbare Hauptspeicher ist konstant. Wenn wir n Java-Prozesse gleichzeitig starten, ohne eine anfängliche Heap-Größe anzugeben, wie verteilt sich die Heap-Größe auf die Prozesse?

Der Mechanismus für die Entscheidung, wie groß der Heap sein soll, wenn Sie keine Größe angeben, hängt von der verwendeten JVM / Plattform / Version ab und davon, ob Sie das Modell "Client" oder "Server" (für Hotspot-JVMs) verwenden. Die Heuristik berücksichtigt nicht die Anzahl oder Größe anderer JVMs.

Referenz: https://stackoverflow.com/a/4667635/139985

In der Praxis ist es wahrscheinlich besser, die Heap-Größe direkt anzugeben.

4) Gibt es einen Prozess, der n JVM-Instanzen verwaltet, oder wird er vom Betriebssystem selbst verwaltet?

Weder. Die Anzahl der JVM-Instanzen wird durch die Aktionen verschiedener Dinge bestimmt, die Prozesse starten können. zB Daemons-Skripte, Befehlsskripte, Benutzer, die Befehle über die Befehlszeile eingeben usw. Letztendlich kann sich das Betriebssystem weigern, weitere Prozesse zu starten, wenn ihm die Ressourcen ausgehen, aber JVMs werden nicht anders behandelt als andere Prozesse.

5) Wenn Stop-the-World während eines GC passiert, sind andere JVM-Instanzen (andere Threads, von denen ich annehme) betroffen?

Nein. Die JVMs sind unabhängige Prozesse. Sie teilen keinen veränderlichen Zustand. Die Speicherbereinigung wird für jede JVM unabhängig ausgeführt.

Stephen C.
quelle
10
  1. sehen So dämonisieren Sie ein Java-Programm.
  2. Eine neue Instanz von JVM wird erstellt
  3. Auf die gleiche Weise wird der Speicher von allen anderen Prozessen gemeinsam genutzt
  4. es wird von O / S verwaltet
  5. andere Instanzen sind nicht betroffen

Wenn Ihre Instanzen ihre Arbeit koordinieren müssen, können Sie eine einzelne Hauptinstanz erstellen, die andere Instanzen ausführen / stoppen würde.

Sie haben nicht erklärt, warum Sie mehrere JVM-Instanzen benötigen. Wahrscheinlich würde eine einzelne Instanz besser funktionieren.

Alexei Kaigorodov
quelle