Esto realmente está vinculado a HotSpot y los valores de opción predeterminados ( Opciones de Java de HotSpot VM ) que difieren entre la configuración del cliente y el servidor.
Del Capítulo 2 del documento técnico ( The Java HotSpot Performance Engine Architecture ):
El JDK incluye dos tipos de VM: una oferta del lado del cliente y una VM ajustada para aplicaciones de servidor. Estas dos soluciones comparten la base de código del entorno de tiempo de ejecución de Java HotSpot, pero utilizan diferentes compiladores que se adaptan a las características de rendimiento claramente únicas de los clientes y servidores. Estas diferencias incluyen la política de compilación en línea y los valores predeterminados del montón.
Aunque las máquinas virtuales del servidor y del cliente son similares, la máquina virtual del servidor se ha ajustado especialmente para maximizar la velocidad máxima de funcionamiento. Está destinado a ejecutar aplicaciones de servidor de larga ejecución, que necesitan la velocidad de operación más rápida posible más que un tiempo de inicio rápido o una menor huella de memoria en tiempo de ejecución.
El compilador de VM del cliente sirve como una actualización tanto para la VM clásica como para los compiladores just-in-time (JIT) utilizados por versiones anteriores del JDK. Client VM ofrece un rendimiento de tiempo de ejecución mejorado para aplicaciones y applets. La máquina virtual Java HotSpot Client se ha ajustado especialmente para reducir el tiempo de inicio de la aplicación y la huella de memoria, lo que la hace especialmente adecuada para entornos de clientes. En general, el sistema del cliente es mejor para las GUI.
Entonces, la verdadera diferencia también está en el nivel del compilador:
El compilador de VM del cliente no intenta ejecutar muchas de las optimizaciones más complejas realizadas por el compilador en la VM del servidor, pero a cambio, requiere menos tiempo para analizar y compilar un fragmento de código. Esto significa que la VM del cliente puede iniciarse más rápido y requiere una huella de memoria más pequeña.
La VM del servidor contiene un compilador adaptativo avanzado que admite muchos de los mismos tipos de optimizaciones realizadas optimizando los compiladores de C ++, así como algunas optimizaciones que los compiladores tradicionales no pueden hacer, como la inserción agresiva en invocaciones de métodos virtuales. Esta es una ventaja competitiva y de rendimiento sobre los compiladores estáticos. La tecnología de optimización adaptativa es muy flexible en su enfoque y generalmente supera incluso las técnicas avanzadas de análisis estático y compilación.
Nota: El lanzamiento de la actualización 10 de jdk6 (ver Notas de la versión de actualización: Cambios en 1.6.0_10 ) trató de mejorar el tiempo de inicio, pero por una razón diferente a las opciones de punto de acceso, se empaquetó de manera diferente con un núcleo mucho más pequeño.
G. Demecki señala en los comentarios que en las versiones de 64 bits de JDK, la -client
opción se ignora durante muchos años.
Ver comando de Windowsjava
:
-client
Selecciona la máquina virtual Java HotSpot Client.
Un JDK con capacidad de 64 bits actualmente ignora esta opción y, en su lugar, utiliza la máquina virtual del servidor de Java Hotspot .
-client
opción se ignora durante muchos años.La diferencia inmediata más visible en las versiones anteriores de Java sería la memoria asignada a una aplicación
-client
en lugar de a otra-server
. Por ejemplo, en mi sistema Linux, obtengo:como está predeterminado
-server
, pero con la-client
opción obtengo:así que con la
-server
mayoría de los límites de memoria y las asignaciones iniciales son mucho más altas para estajava
versión.Sin embargo, estos valores pueden cambiar para diferentes combinaciones de arquitectura, sistema operativo y versión jvm. Las versiones recientes de jvm han eliminado las banderas y han eliminado muchas de las distinciones entre servidor y cliente.
Recuerde también que puede ver todos los detalles de una ejecución
jvm
usandojvisualvm
. Esto es útil si tiene usuarios que o módulos que establecenJAVA_OPTS
o usan secuencias de comandos que cambian las opciones de la línea de comandos. Esto también le permitirá monitorear, en tiempo real, el uso del espacio de almacenamiento dinámico y permanente junto con muchas otras estadísticas.fuente
Los sistemas -client y -server son binarios diferentes. Son esencialmente dos compiladores diferentes (JIT) que interactúan con el mismo sistema de tiempo de ejecución. El sistema cliente es óptimo para aplicaciones que necesitan tiempos de inicio rápidos o pequeñas huellas, el sistema de servidor es óptimo para aplicaciones donde el rendimiento general es más importante. En general, el sistema cliente es más adecuado para aplicaciones interactivas como las GUI
Ejecutamos el siguiente código con ambos interruptores:
Nota: ¡ El código se ha compilado solo una vez! ¡Las clases son iguales en ambas carreras!
Con -client:
java.exe -client -classpath C: \ mywork \ classes com.blogspot.sdoulger.LoopTest
Tiempo empleado: 766
Con -server:
java.exe -server -classpath C: \ mywork \ classes com.blogspot.sdoulger.LoopTest
Tiempo empleado: 0
Parece que la optimización más agresiva del sistema del servidor, elimina el bucle, ya que entiende que no realiza ninguna acción.
Referencia
fuente
Una diferencia que acabo de notar es que en el modo "cliente", parece que la JVM devuelve algo de memoria no utilizada al sistema operativo, mientras que con el modo "servidor", una vez que la JVM toma la memoria, no le dará espalda. Así es como aparece en Solaris con Java6 de todos modos (usando
prstat -Z
para ver la cantidad de memoria asignada a un proceso).fuente
La documentación en línea de Oracle proporciona información para Java SE 7.
En java, la página de inicio de aplicaciones Java para Windows, la
-client
opción se ignora en un JDK de 64 bits:Sin embargo (para hacer las cosas interesantes), debajo
-server
dice:La página de detección de máquina de clase de servidor proporciona información sobre qué VM está seleccionada por el sistema operativo y la arquitectura.
No sé cuánto de esto se aplica a JDK 6.
fuente
De Goetz - Concurrencia de Java en la práctica:
Mi énfasis YMMV
fuente
IIRC, la máquina virtual del servidor, realiza más optimizaciones de punto de acceso al inicio, por lo que se ejecuta más rápido, pero tarda un poco más en iniciarse y usa más memoria. La máquina virtual cliente difiere la mayor parte de la optimización para permitir un inicio más rápido.
Editar para agregar: Aquí hay información de Sun, no es muy específica, pero le dará algunas ideas.
fuente
IIRC, involucra estrategias de recolección de basura. La teoría es que un cliente y un servidor serán diferentes en términos de objetos de corta duración, lo cual es importante para los algoritmos GC modernos.
Aquí hay un enlace en modo servidor. Por desgracia, no mencionan el modo cliente.
Aquí hay un enlace muy completo sobre GC en general; Este es un artículo más básico . No estoy seguro si la dirección -server vs -client pero este es material relevante.
En No Fluff Just Stuff, tanto Ken Sipe como Glenn Vandenburg hacen grandes conversaciones sobre este tipo de cosas.
fuente
No noté ninguna diferencia en el tiempo de inicio entre los 2, pero registró una mejora muy mínima en el rendimiento de la aplicación con "-server" (servidor Solaris, todos los que usan SunRays para ejecutar la aplicación). Eso fue menos de 1.5.
fuente
La última vez que eché un vistazo a esto (y es cierto que fue hace un tiempo) la mayor diferencia que noté fue en la recolección de basura.
IIRC:
Si puede comparar dos máquinas virtuales Java, un cliente y un servidor utilizando la herramienta jvisualvm , debería ver una diferencia en la frecuencia y el efecto de la recolección de basura, así como en el número de generaciones.Tenía un par de capturas de pantalla que mostraban la diferencia realmente bien, pero no puedo reproducirlo ya que tengo una JVM de 64 bits que solo implementa la VM del servidor. (Y no puedo molestarme en descargar y discutir la versión de 32 bits en mi sistema también).Este ya no parece ser el caso, después de haber intentado ejecutar algún código en Windows con máquinas virtuales de servidor y cliente, parece que obtengo el mismo modelo de generación para ambos ...
fuente
Al realizar una migración de la versión 1.4 a 1.7 ("1.7.0_55"). Lo que observamos aquí es que no existen tales diferencias en los valores predeterminados asignados a los parámetros heapsize | permsize | ThreadStackSize en modo cliente y servidor.
Por cierto, ( http://www.oracle.com/technetwork/java/ergo5-140223.html ). Este es el fragmento tomado del enlace anterior.
ThreadStackSize es más alto en 1.7, mientras que en el foro Open JDK, hay discusiones que indican que el tamaño del marco es algo más alto en la versión 1.7. Se cree que la diferencia real podría ser posible medir en tiempo de ejecución en función del comportamiento de su aplicación
fuente