424 Stimmen

Echte Unterschiede zwischen "java -server" und "java -client"?

Gibt es einen echten praktischen Unterschied zwischen "java -server" und "java -client"?

Alles, was ich auf der Website von Sun finden kann, ist eine vage

"Server startet langsamer, sollte aber schneller laufen".

Was sind die wirklichen Unterschiede? (Ich verwende derzeit JDK 1.6.0_07.)

18voto

Adam Punkte 4915

Von Goetz - Java Gleichzeitigkeit in der Praxis:

  1. Tipp zur Fehlersuche: Achten Sie bei Serveranwendungen darauf, dass Sie immer die -server JVM-Befehlszeilenschalter beim Aufrufen der JVM, auch für Entwicklung und Erprobung . Die Server-JVM führt mehr Optimierungen durch als die Client-JVM durch, z. B. das Auslagern von Variablen aus einer Schleife, die die in der Schleife nicht verändert werden; Code, der in der Entwicklungsumgebung (Client-JVM) zu funktionieren scheint, kann in der Umgebung (Server-JVM) versagen. Hätten wir zum Beispiel "vergessen", die Variable die Variable asleep in Listing 3.4 als flüchtig zu deklarieren, die Server-JVM könnte den Test aus der Schleife herausziehen (und ihn in eine Endlosschleife verwandeln), aber die Client-JVM würde nicht . Eine Endlosschleife, die sich in Entwicklung auftritt, ist weit weniger kostspielig als eine, die erst in der Produktion auftaucht.

Auflistung 3.4. Schafe zählen.

volatile boolean asleep;
...
while (!asleep)
   countSomeSheep();

Meine Betonung. YMMV

15voto

Mike Akers Punkte 11559

IIRC die Server-VM macht mehr Hotspot-Optimierungen beim Start, so dass es schneller läuft, aber dauert ein wenig länger zu starten und verwendet mehr Speicher. Die Client-VM verschiebt den Großteil der Optimierung, um einen schnelleren Start zu ermöglichen.

Bearbeiten um hinzuzufügen: Hier sind einige Informationen von Sun, es ist nicht sehr spezifisch, aber es wird Ihnen einige Ideen geben.

5voto

Michael Easter Punkte 22288

Wenn ich mich recht erinnere, geht es dabei um Strategien der Müllabfuhr. Die Theorie besagt, dass ein Client und ein Server sich in Bezug auf kurzlebige Objekte unterscheiden, was für moderne GC-Algorithmen wichtig ist.

Hier ist ein Link im Server-Modus. Leider wird der Client-Modus nicht erwähnt.

Hier ist ein sehr ausführlicher Link auf GC im Allgemeinen; dies ist eine grundlegenderer Artikel . Ich bin nicht sicher, ob es sich um Server oder Client handelt, aber das ist relevantes Material.

Bei No Fluff Just Stuff halten sowohl Ken Sipe als auch Glenn Vandenburg großartige Vorträge über diese Art von Themen.

3voto

Brian Knoblauch Punkte 19629

Ich habe keinen Unterschied in der Startzeit zwischen den beiden festgestellt, aber eine sehr minimale Verbesserung in der Anwendungsleistung mit "-server" (Solaris-Server, alle verwenden SunRays, um die Anwendung auszuführen) gemessen. Das war unter 1.5.

2voto

brice Punkte 22973

Als ich das letzte Mal einen Blick darauf warf (und das ist zugegebenermaßen schon eine Weile her), war der größte Unterschied, der mir auffiel, in der Garbage Collection.

IIRC:

  • Die Server-Heap-VM hat eine andere Anzahl von Generationen als die Client-VM und einen anderen Garbage-Collection-Algorithmus. Dies ist vielleicht nicht mehr der Fall
  • Die Server-VM weist Speicher zu und gibt ihn nicht an das Betriebssystem frei.
  • Die Server-VM verwendet anspruchsvollere Optimierungsalgorithmen und hat daher einen höheren Zeit- und Speicherbedarf für die Optimierung

Wenn Sie zwei Java-VMs, einen Client und einen Server, mit dem jvisualvm sollten Sie einen Unterschied in der Häufigkeit und Wirkung der Garbage Collection sowie in der Anzahl der Generationen feststellen.

Ich hatte ein paar Screenshots, die den Unterschied sehr gut zeigten, aber ich kann es nicht reproduzieren, da ich eine 64-Bit-JVM habe, die nur die Server-VM implementiert. (Und ich kann nicht die Mühe machen, die 32-Bit-Version auf meinem System herunterzuladen und zu ringen).

Dies scheint nicht mehr der Fall zu sein, nachdem ich versucht habe, einige Codes unter Windows sowohl mit Server- als auch mit Client-VMs auszuführen, scheine ich das gleiche Generierungsmodell für beide zu erhalten...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X