java - Diferenças reais entre “java -server” e “java -client”?




6 Answers

Isso está realmente ligado ao HotSpot e aos valores de opção padrão ( Java HotSpot VM Options ), que diferem entre a configuração do cliente e do servidor.

Do Capítulo 2 do white paper ( A Arquitetura do Mecanismo de Desempenho do HotSpot Java ):

O JDK inclui dois tipos de VM - uma oferta do lado do cliente e uma VM ajustada para aplicativos de servidor. Essas duas soluções compartilham a base de código do Java Runtime do Java HotSpot, mas usam compiladores diferentes que são adequados às características de desempenho distintamente exclusivas de clientes e servidores. Essas diferenças incluem a política de inlining de compilação e os padrões de heap.

Embora as VMs do servidor e do cliente sejam semelhantes, a VM do servidor foi especialmente ajustada para maximizar a velocidade máxima de operação. Destina-se à execução de aplicativos de servidor de longa execução, que precisam da velocidade de operação mais rápida possível, mais do que um tempo de inicialização rápido ou menor consumo de memória de tempo de execução.

O compilador VM cliente serve como uma atualização para a VM Clássica e para os compiladores just-in-time (JIT) usados ​​pelas versões anteriores do JDK. A VM do cliente oferece desempenho de tempo de execução aprimorado para aplicativos e applets. A Java Client do Java HotSpot foi especialmente ajustada para reduzir o tempo de inicialização do aplicativo e o consumo de memória, tornando-a particularmente adequada para ambientes de clientes. Em geral, o sistema do cliente é melhor para GUIs.

Portanto, a diferença real também está no nível do compilador:

O compilador VM cliente não tenta executar muitas das otimizações mais complexas executadas pelo compilador na VM do servidor, mas em troca, requer menos tempo para analisar e compilar uma parte do código. Isso significa que a VM do cliente pode ser iniciada mais rapidamente e requer um espaço menor de memória.

A VM do servidor contém um compilador adaptativo avançado que suporta muitos dos mesmos tipos de otimizações executadas pela otimização de compiladores C ++, bem como algumas otimizações que não podem ser feitas por compiladores tradicionais, como inlining agressivo entre invocações de método virtual. Essa é uma vantagem competitiva e de desempenho em relação aos compiladores estáticos. A tecnologia de otimização adaptativa é muito flexível em sua abordagem e normalmente supera até mesmo técnicas avançadas de análise e compilação estática.

Nota: O release do jdk6 update 10 (consulte Atualizar Notas da Versão: Alterações no 1.6.0_10 ) tentou melhorar o tempo de inicialização, mas por um motivo diferente das opções do hotspot, sendo empacotado de maneira diferente com um kernel muito menor.

G. Demecki aponta nos comentários que nas versões de 64 bits do JDK, a opção -client é ignorada por muitos anos.
Veja o comando java Windows :

-client

Seleciona a VM do Java HotSpot Client.
Um JDK compatível com 64 bits atualmente ignora essa opção e, em vez disso, usa a VM do Java Hotspot Server .

Existe alguma diferença prática real entre "java -server" e "java -client"? Tudo o que posso encontrar no site da Sun é um vago "- o servidor começa mais devagar, mas deve ser executado mais rápido". Quais são as diferenças reais? (Usando o JDK 1.6.0_07 atualmente.)




Uma diferença que acabei de notar é que no modo "cliente", parece que a JVM realmente fornece alguma memória não utilizada de volta ao sistema operacional - ao passo que no modo "servidor", uma vez que a JVM agarra a memória, ela não dará de volta. Assim é como aparece no Solaris com o Java6 (usando prstat -Z para ver a quantidade de memória alocada para um processo).




A documentação on-line da Oracle fornece algumas informações para o Java SE 7.

No java - a página do ativador de aplicativos Java para Windows, a opção -client é ignorada em um JDK de 64 bits:

Selecione a VM do Java HotSpot Client. Um jdk capaz de 64 bits atualmente ignora essa opção e, em vez disso, usa a VM do Java HotSpot Server.

No entanto (para tornar as coisas interessantes), sob- -server afirma:

Selecione a VM do Java HotSpot Server. Em um jdk com capacidade de 64 bits, apenas a VM do Java HotSpot Server é suportada, portanto, a opção -server é implícita. Isso está sujeito a alterações em uma versão futura.

A página Detecção de máquina de classe de servidor fornece informações sobre qual VM é selecionada pelo SO e pela arquitetura.

Não sei quanto disso se aplica ao JDK 6.




De Goetz - Java Concorrência na Prática:

  1. Dica de Depuração: Para aplicativos do servidor, certifique-se sempre de especificar a opção de linha de comandos JVM do servidor ao chamar a JVM, mesmo para desenvolvimento e teste . A JVM do servidor executa mais otimização do que a JVM do cliente, como a elevação de variáveis ​​de um loop que não são modificadas no loop; código que pode parecer funcionar no ambiente de desenvolvimento (JVM do cliente) pode quebrar no ambiente de implementação (servidor JVM). Por exemplo, se tivéssemos “esquecido” de declarar a variável adormecida como volátil na Listagem 3.4, a JVM do servidor poderia elevar o teste do loop (transformando-o em um loop infinito), mas a JVM do cliente não o faria . Um loop infinito que aparece no desenvolvimento é muito menos caro do que aquele que só aparece na produção.

Listagem 3.4. Contando ovelhas.

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

Minha ênfase. YMMV




Eu não notei nenhuma diferença no tempo de inicialização entre os 2, mas registrei uma melhoria muito pequena no desempenho do aplicativo com "-servidor" (servidor Solaris, todos usando SunRays para executar o aplicativo). Isso foi menos de 1,5.




Ao fazer uma migração de 1.4 para 1.7 ("1.7.0_55") version.The coisa que observamos aqui é, não há tais diferenças nos valores padrão atribuídos aos parâmetros heapsize | permsize | ThreadStackSize no modo cliente e servidor.

By the way, ( http://www.oracle.com/technetwork/java/ergo5-140223.html ). Este é o trecho extraído do link acima.

initial heap size of 1/64 of physical memory up to 1Gbyte
maximum heap size of ¼ of physical memory up to 1Gbyte

ThreadStackSize é maior em 1.7, enquanto passa pelo fórum Open JDK, existem discussões que afirmaram que o tamanho do frame é um pouco mais alto na versão 1.7. Acredita-se que a diferença real seja possível medir em tempo de execução com base no seu comportamento de sua aplicação




Related

java jvm jvm-hotspot