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.)

396voto

VonC Punkte 1117238

Dies ist wirklich verbunden mit HotSpot und der Standard Optionswerte ( Java HotSpot VM-Optionen ), die sich je nach Client- und Serverkonfiguration unterscheiden.

De Kapitel 2 des Whitepapers ( Die Java HotSpot Performance Engine Architektur ):

Das JDK enthält zwei Varianten der VM - ein clientseitiges Angebot und eine VM, die auf Serveranwendungen abgestimmt ist. Diese beiden Lösungen nutzen die Codebasis der Java HotSpot-Laufzeitumgebung, verwenden aber unterschiedliche Compiler, die auf die unterschiedlichen Leistungsmerkmale von Clients und Servern abgestimmt sind. Zu diesen Unterschieden gehören die Inlining-Richtlinie für die Kompilierung und die Heap-Standardwerte.

Obwohl die Server- und die Client-VMs ähnlich sind, wurde die Server-VM speziell darauf abgestimmt, die Spitzenbetriebsgeschwindigkeit zu maximieren. Sie ist für die Ausführung lang laufender Serveranwendungen gedacht, bei denen die schnellstmögliche Betriebsgeschwindigkeit wichtiger ist als eine schnelle Startzeit oder ein geringerer Laufzeitspeicherbedarf.

Der Client-VM-Compiler dient als Upgrade sowohl für den Classic-VM- als auch für den Just-in-Time-Compiler (JIT), die von früheren Versionen des JDK verwendet wurden. Die Client VM bietet eine verbesserte Laufzeitleistung für Anwendungen und Applets. Die Java HotSpot Client VM wurde speziell darauf abgestimmt, die Startzeit und den Speicherbedarf von Anwendungen zu reduzieren, wodurch sie sich besonders gut für Client-Umgebungen eignet. Im Allgemeinen ist das Client-System besser für GUIs geeignet.

Der eigentliche Unterschied liegt also auch auf der Ebene des Compilers:

Der Client-VM-Compiler versucht nicht, viele der komplexeren Optimierungen auszuführen, die der Compiler in der Server-VM vornimmt, benötigt dafür aber weniger Zeit für die Analyse und Kompilierung eines Codes. Dies bedeutet, dass die Client-VM schneller gestartet werden kann und weniger Speicherplatz benötigt.

Die Server-VM enthält einen fortschrittlichen adaptiven Compiler, der viele der gleichen Arten von Optimierungen unterstützt, die von optimierenden C++-Compilern durchgeführt werden, sowie einige Optimierungen, die von herkömmlichen Compilern nicht durchgeführt werden können, wie z. B. aggressives Inlining über virtuelle Methodenaufrufe. Dies ist ein Wettbewerbs- und Leistungsvorteil gegenüber statischen Compilern. Die adaptive Optimierungstechnologie ist in ihrem Ansatz sehr flexibel und übertrifft in der Regel selbst fortgeschrittene statische Analyse- und Kompilierungstechniken.

Hinweis: Die Veröffentlichung von jdk6 Update 10 (siehe Update Release Notes:Änderungen in 1.6.0_10 ) versucht, die Startzeit zu verbessern, aber aus einem anderen Grund als die Hotspot-Optionen, da sie anders verpackt sind und einen viel kleineren Kernel haben.


G. Demecki weist darauf hin in den Kommentaren dass in 64-Bit-Versionen des JDK die -client Diese Option wird seit vielen Jahren ignoriert.
Siehe Windows java commande :

-client

Wählt die Java HotSpot Client VM aus.
Ein 64-Bit-fähiges JDK ignoriert derzeit diese Option und verwendet stattdessen die Java Hotspot Server VM .


2022: Holger Referenzen in die Kommentare die JavaSE6 / Erkennung von Maschinen der Server-Klasse und fügte hinzu:

Nur auf 32-Bit-Windows-Systemen, -client wurde jemals bedingungslos ausgewählt.
Andere Systeme überprüften, ob der Rechner der "Serverklasse" angehörte, was der Fall war, wenn er über mindestens 2 Kerne und mindestens 2 GB Arbeitsspeicher verfügte.

Das erklärt, warum fast alles mit -server seit geraumer Zeit. Selbst die billigsten Computer, die Sie finden können, sind "Serverklasse"-Maschinen. Die 64er Builds von Sun/Oracle wurden nicht einmal mit einer Client-JVM ausgeliefert.

94voto

Mark Booth Punkte 7224

Der sichtbarste unmittelbare Unterschied in älteren Versionen von Java ist der Speicher, der einer -client im Gegensatz zu einer -server Anwendung. Auf meinem Linux-System erhalte ich zum Beispiel:

$ java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight               = 20               {product}
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                     := 66328448         {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                         := 1063256064       {product}
uintx MaxPermSize                          = 67108864         {pd product}
uintx PermSize                             = 16777216         {pd product}
java version "1.6.0_24"

da sie standardmäßig auf -server sondern mit dem -client Option bekomme ich:

$ java -client -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight               = 20               {product}
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                     := 16777216         {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                         := 268435456        {product}
uintx MaxPermSize                          = 67108864         {pd product}
uintx PermSize                             = 12582912         {pd product}
java version "1.6.0_24"

also mit -server die meisten Speichergrenzen und anfänglichen Zuweisungen sind bei dieser Methode viel höher java Version.

Diese Werte können sich jedoch für verschiedene Kombinationen von Architektur, Betriebssystem und JVM-Version ändern. Neuere Versionen der jvm haben Flags entfernt und viele der Unterscheidungen zwischen Server und Client aufgehoben.

Denken Sie auch daran, dass Sie alle Details eines laufenden Projekts sehen können jvm mit jvisualvm . Dies ist nützlich, wenn Sie Benutzer oder Module haben, die JAVA_OPTS oder Skripte verwenden, die Befehlszeilenoptionen ändern. So können Sie auch in Echtzeit überwachen, Haufen y permgen Platzverbrauch und viele andere Statistiken.

39voto

Premraj Punkte 65511

Das -Client- und das -Server-System sind unterschiedliche Binärdateien. Sie sind im Wesentlichen zwei verschiedene Compiler (JITs), die mit demselben Laufzeitsystem zusammenarbeiten. Das Client-System ist optimal für Anwendungen, die schnelle Startzeiten oder einen kleinen Footprint benötigen, das Server-System ist optimal für Anwendungen, bei denen die Gesamtleistung im Vordergrund steht. Im Allgemeinen ist das Client-System besser für interaktive Anwendungen wie grafische Benutzeroberflächen geeignet.

enter image description here

Wir führen den folgenden Code mit beiden Schaltern aus:

package com.blogspot.sdoulger;

public class LoopTest {
    public LoopTest() {
        super();
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        spendTime();
        long end = System.currentTimeMillis();
        System.out.println("Time spent: "+ (end-start));

        LoopTest loopTest = new LoopTest();
    }

    private static void spendTime() {
        for (int i =500000000;i>0;i--) {
        }
    }
}

Note : Der Code wird nur einmal kompiliert! Die Klassen sind in beiden Durchläufen die gleichen!

Mit -client:
java.exe -client -classpath C:\mywork\classes com.blogspot.sdoulger.LoopTest
Zeitaufwand: 766

Mit -server:
java.exe -server -classpath C:\mywork\classes com.blogspot.sdoulger.LoopTest
Verbrachte Zeit: 0

Es scheint, dass die aggressivere Optimierung des Server-Systems, entfernen Sie die Schleife, wie es versteht, dass es keine Aktion durchführen!

Referenz

34voto

prule Punkte 2478

Ein Unterschied, der mir gerade aufgefallen ist, besteht darin, dass die JVM im "Client"-Modus anscheinend tatsächlich ungenutzten Speicher an das Betriebssystem zurückgibt, während die JVM im "Server"-Modus, sobald sie den Speicher belegt hat, diesen nicht mehr zurückgibt. So sieht es jedenfalls auf Solaris mit Java6 aus (mit prstat -Z um zu sehen, wie viel Speicher einem Prozess zugewiesen wurde).

24voto

pharsicle Punkte 1199

Die Online-Dokumentation von Oracle enthält einige Informationen zu Java SE 7.

Auf der java - das Startprogramm für Java-Anwendungen Seite für Windows, die -client wird in einem 64-Bit-JDK ignoriert:

Wählen Sie die Java HotSpot Client VM. Ein 64-Bit-fähiges jdk ignoriert derzeit diese Option und verwendet stattdessen die Java HotSpot Server VM.

Allerdings (um die Sache interessant zu machen), unter -server heißt es:

Wählen Sie die Java HotSpot Server VM. Auf einem 64-Bit-fähigen jdk wird nur die Java HotSpot Server VM unterstützt, so dass die Option -server implizit ist. Dies kann sich in einer zukünftigen Version ändern.

Le site Erkennung von Maschinen der Server-Klasse Seite gibt Auskunft darüber, welche VM nach Betriebssystem und Architektur ausgewählt ist.

Ich weiß nicht, wie viel davon auf JDK 6 zutrifft.

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