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.