395 votes

Les véritables différences entre "java server" et "java -client"?

Est-il réellement pratique, la différence entre "java server" et "java -client"? Tout ce que je peux trouver sur les Chaises du site est un vague "-serveur démarre plus lent, mais doit courir plus vite". Quelles sont les réelles différences? (À l'aide du JDK 1.6.0_07 actuellement.)

369voto

VonC Points 414372

C'est vraiment lié à un HotSpot par défaut et les valeurs de l'option (Java HotSpot VM Options), qui diffèrent entre le client et le serveur de configuration.

À partir du Chapitre 2 du livre blanc (La Java HotSpot Moteur de Performance de l'Architecture):

Le JDK comprend deux versions de la machine virtuelle -- un client du côté de l'offre, et une VM à l'écoute pour des applications de serveur. Ces deux solutions partagent la Java HotSpot de l'environnement d'exécution de code à la base, mais l'utilisation des compilateurs différents qui sont adaptés à l'distinctement unique de caractéristiques de performance des clients et des serveurs. Ces différences comprennent la compilation d'inlining de la politique et des tas de défauts.

Bien que le Serveur et le Client VMs sont similaires, le Serveur VM a été spécialement réglé pour maximiser le pic de vitesse de fonctionnement. Il est prévu pour l'exécution de longue durée d'exécution du serveur d'applications, qui ont besoin de la manière la plus rapide possible, la vitesse de fonctionnement plus qu'un démarrage rapide du temps ou de l'exécution plus petite empreinte mémoire.

Le Client VM compilateur sert comme une mise à niveau pour à la fois le Classique de la VM et le juste-à-temps (JIT) compilateurs utilisés par les précédentes versions du JDK. Le Client VM vous propose d'améliorer le temps d'exécution performance des applications et des applets. La Java HotSpot Client VM a été spécialement optimisé pour réduire la demande de temps de démarrage et de la mémoire, ce qui le rend particulièrement bien adapté pour les environnements client. En général, le système client est mieux pour les Interfaces graphiques.

Donc, la différence est également sur le niveau du compilateur:

Le Client VM compilateur n'essayez pas d'exécuter beaucoup de de la plus complexe des optimisations effectuées par le compilateur dans le Serveur de VM, mais en échange, il exige moins de temps pour analyser et compiler un morceau de code. Cela signifie que le Client VM peut démarrer plus rapidement et nécessite une plus petite empreinte mémoire.

Le Serveur VM contient une avancée adaptative compilateur qui prend en charge un grand nombre des mêmes types d'optimisations effectuées par l'optimisation des compilateurs C++, ainsi que des optimisations qui ne peut pas être fait par le système traditionnel des compilateurs, comme agressive inline virtuel à travers des appels de méthode. C'est un environnement concurrentiel et d'avantage de performance sur la statique des compilateurs. Adaptative d'optimisation de la technologie est très flexible dans son approche, et, généralement, surpasse même avancé l'analyse statique et les techniques de compilation.

Remarque: La libération de jdk6 mise à jour de 10 (voir mise à Jour des Notes de Version:Changements dans 1.6.0_10) a essayé d'améliorer les temps de démarrage, mais pour une autre raison que pour le hotspot des options, étant conditionnés différemment mais avec beaucoup moins de noyau.

90voto

Mark Booth Points 2710

La partie la plus visible de différence immédiate serait la mémoire allouée à un -client , par opposition à un -server application. Par exemple, sur mon système Linux, j'obtiens:

$ 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"

comme la valeur par défaut est -server, mais avec l' -client option j'obtiens:

$ 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"

donc, avec -server la plupart des limites de la mémoire et des allocations initiales sont beaucoup plus élevés.

Rappelez-vous aussi que vous pouvez voir tous les détails de l'exécution d'un jvm l'aide jvisualvm. Ceci est utile si vous avez des utilisateurs qui ou modules qui définissent JAVA_OPTS ou utiliser des scripts pour changer d'option de ligne de commande. Cela vous permettra aussi de suivre, en temps réel, et de tas permgen space utilisation ainsi que beaucoup d'autres stats.

33voto

prule Points 695

Une différence que je viens de remarquer, c'est que dans "client" mode, il semble que la JVM, de fait, donne certains de la mémoire inutilisée sur le système d'exploitation -, alors qu'avec le mode "serveur", une fois que la JVM attrape la mémoire, il ne le laissera pas en arrière. C'est la façon dont elle apparaît sur un système Solaris avec Java6 de toute façon (à l'aide de prstat -Z pour voir la quantité de mémoire allouée à un processus).

22voto

pharsicle Points 527

Oracle de la documentation en ligne fournit des informations pour Java SE 7.

Sur le java – Java lanceur d'application page pour Windows, l' -client option est ignorée dans la version 64 bits du JDK:

Sélectionnez la Java HotSpot Client VM. Une version 64 bits capable de jdk actuellement ignore cette option et utilise à la place la Java HotSpot Server VM.

Cependant, pour rendre les choses intéressantes), en vertu de l' -server il déclare:

Sélectionnez la Java HotSpot Server VM. Sur un 64 bits jdk seulement le Java HotSpot Server VM est pris en charge pour le serveur option est implicite. C'est l'objet de modifications dans une version future.

Le Serveur de la Classe de la Machine de Détection de la page donne des informations sur la VM qui est sélectionné par l'OS et de l'architecture.

Je ne sais pas combien de cela s'applique à JDK 6.

15voto

Mike Akers Points 4866

IIRC le serveur VM ne plus hotspot optimisations au démarrage de sorte qu'il s'exécute plus rapidement, mais prend un peu plus de temps pour démarrer et utilise plus de mémoire. Le client VM reporte plus de l'optimisation pour permettre le démarrage plus rapide.

Modifier pour ajouter: Voici quelques infos de Soleil, c'est pas très précis, mais de vous donner quelques idées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X