otimização de desempenho jvm
**************************
Otimização do projeto: sistema operacional, arquitetura do projeto, código do programa, banco de dados, parâmetros jvm
Otimização do sistema operacional: memória, CPU, dispositivos de armazenamento etc.
Otimização da arquitetura do projeto : crie uma arquitetura razoável para o aplicativo
Otimização do código do programa: evite carregar muitos objetos de uma só vez, não faça referência a objetos de curto período com variáveis de longa duração, etc.
Otimização de banco de dados: crie um banco de dados e uma estrutura de tabela razoáveis para o projeto
otimização jvm: coletor de lixo e configurações de parâmetros de memória
Nota: Antes da otimização da jvm, é necessário otimizar a arquitetura do projeto, o código etc. Se a arquitetura do projeto ou o design do código for insuficiente, o ajuste dos parâmetros da jvm terá pouco efeito no desempenho do aplicativo
**************************
Indicadores de avaliação de ajuste da JVM : memória, rendimento, latência
Memória: a memória necessária para o funcionamento normal do programa
Taxa de transferência: a proporção entre o tempo de execução do aplicativo e o tempo total (tempo de execução do aplicativo + tempo de coleta de lixo)
Atraso: o tempo de pausa do aplicativo durante a coleta de lixo
O objetivo do ajuste da jvm é obter maior taxa de transferência ou latência menor com menos memória , mas esses três objetivos não podem ser alcançados simultaneamente:
Se você definir uma memória maior , a coleta de lixo levará mais tempo, resultando em um atraso maior ;
Se você definir uma memória mais baixa , ela acionará a coleta frequente de lixo, afetando a taxa de transferência
**********************
Coletor de lixo : thread único, paralelo, simultâneo, precisa escolher o coletor de lixo apropriado de acordo com o cenário do aplicativo
***************
Coletor de lixo de thread único: serial (nova geração), serial antigo (geração antiga)
Recursos: Durante a coleta de lixo, os threads do usuário param de funcionar e há apenas um thread de coleta de lixo
Cenários de aplicativos: adequados para aplicativos de desktop, com dezenas ou centenas de megabytes de lixo coletado e curtos períodos de pausa causados pela coleta de lixo
Parâmetros relacionados
-XX: + UseSerialGC: use combinação de coleta de lixo antiga serial + serial
***************
Coletor de lixo paralelo : eliminação paralela (nova geração), paralela antiga (geração antiga)
Recursos: Durante a coleta de lixo, o encadeamento do usuário para e pode haver vários encadeamentos de coleta de lixo
Cenário do aplicativo: a eliminação paralela é um coletor de lixo com taxa de transferência primeiro, que fornece parâmetros para controlar o tempo e a taxa de transferência máximos
Parâmetros relacionados
-XX: + UseParallelGC: use eliminação paralela + combinação paralela de coletor de lixo antigo
-XX: + UseParallelOldGC: use a combinação de eliminação paralela + coletor de lixo antigo paralelo, esse parâmetro java14 será desativado e poderá ser removido no futuro
Java HotSpot(TM) 64-Bit Server VM warning: Option UseParallelOldGC was deprecated
in version 14.0 and will likely be removed in a future release.
-XX: ParallelGCThreads: define o número de encadeamentos de reciclagem simultâneos
-XX: MaxGCPauseMillis: a pausa máxima em milissegundos, se a memória da pilha for muito grande, o tempo de pausa durante a coleta de lixo pode exceder o valor definido
-XX: GCTimeRatio: Taxa de transferência, o padrão é 99 e o uso máximo de 1% do tempo para coletar lixo
-XX: + UseAdaptiveSizePolicy: ajusta automaticamente o tamanho da geração jovem (-Xmn), a proporção de éden para sobrevivente (-XX: SurvivorRatio) e outros parâmetros
***************
Coletor de lixo simultâneo: G1 (nova geração, geração antiga)
Características: Durante a coleta de lixo, os threads do usuário podem funcionar, apenas uma breve pausa, pode haver vários threads de coleta de lixo
Cenário de aplicação: adequado para cenários de baixa pausa, comparado com a combinação paralela de eliminação + paralela antiga, o tempo de pausa do G1 é mais controlável
Parâmetros relacionados
-XX: + UseG1GC: use o coletor de lixo G1
**********************
Configuração de parâmetros de memória: Em circunstâncias normais, o uso dos parâmetros padrão pode atender aos requisitos de desempenho
***************
Parâmetros comuns
-Xms: define o valor mínimo da pilha
-Xmx: define o valor máximo da pilha
-XX: NewSize: define o valor mínimo da nova geração
-XX: MaxNewSize: define o valor máximo da nova geração
-Xmn: define o tamanho da nova geração, que é equivalente a definir NewSize e MaxNewSize com o mesmo valor
-XX: NewRatio: define a proporção da nova geração para a geração antiga, o padrão é 2, ou seja, a nova geração: geração antiga = 1: 2
-XX: SurvivorRatio: define a proporção de eden e survivor, o padrão é 8, ou seja: eden: survivor = 8: 1
***************
Medidas de otimização
Defina um tamanho de heap inicial razoável ou defina o tamanho máximo e mínimo para o mesmo, para evitar que o dimensionamento da memória heap afete o desempenho;
Ajuste o tamanho da memória da geração antiga para evitar o disparo total de gc com frequência;
Ajuste o tamanho da memória da geração jovem para evitar o acionamento frequente da geração jovem gc, resultando em um grande número de objetos entrando na geração antiga;
Use coletores de lixo paralelos ou simultâneos para coleta de lixo ;
Considere usar uma versão alta do jdk, o lançamento estável da versão alta do jdk geralmente tem um desempenho mais alto