Guia para os parâmetros mais importantes da JVM

Guia para os parâmetros mais importantes da JVM

1. Visão geral

Neste tutorial rápido, vamos explorar as opções mais conhecidas que podem ser usadas para configurar a Java Virtual Machine.

2. Memória explícita de heap - opções Xms e Xmx

Uma das práticas mais comuns relacionadas ao desempenho é inicializar a memória heap conforme os requisitos do aplicativo.

É por isso que devemos especificar o tamanho mínimo e máximo do heap. Os parâmetros abaixo podem ser usados ​​para alcançá-lo:

-Xms[unit]
-Xmx[unit]

Aqui,unit denota a unidade na qual a memória (indicada porheap size) deve ser inicializada. As unidades podem ser marcadas como‘g' para GB,‘m' para MB e‘k' para KB.

Por exemplo, se queremos atribuir no mínimo 2 GB e no máximo 5 GB à JVM, precisamos escrever:

-Xms2G -Xmx5G

A partir do Java 8, o tamanho deMetaspace não está definido. Quando atinge o limite global, a JVM aumenta automaticamente. No entanto, para superar qualquer instabilidade desnecessária, podemos definir o tamanho deMetaspace com:

-XX:MaxMetaspaceSize=[unit]

Aqui,metaspace size denota a quantidade de memória que queremos atribuir aMetaspace.

De acordo comOracle guidelines, após a memória total disponível, o segundo fator mais influente é a proporção da pilha reservada para a geração jovem. Por padrão, o tamanho mínimo do YG é 1310MB, e o tamanho máximo éunlimited.

Podemos atribuí-los explicitamente:

-XX:NewSize=[unit]
-XX:MaxNewSize=[unit]

3. Coleta de lixo

Para melhor estabilidade da aplicação, a escolha do algoritmoGarbage Collection correto é crítica.

JVM tem quatro tipos de implementaçõesGC:

  • Coletor de Lixo Serial

  • Coletor de Lixo Paralelo

  • Coletor de lixo do CMS

  • Coletor de lixo G1

Essas implementações podem ser declaradas com os parâmetros abaixo:

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

Mais detalhes sobre as implementações deGarbage Collection podem ser encontrados emhere.

4. Log de GC

Para monitorar estritamente a saúde do aplicativo, devemos sempre verificar o desempenhoGarbage Collection da JVM. A maneira mais fácil de fazer isso é registrar a atividade deGC em formato legível por humanos.

Usando os seguintes parâmetros, podemos registrar a atividade deGC:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

UseGCLogFileRotation especifica a política de rolagem do arquivo de log, bem como log4j, s4lj, etc. NumberOfGCLogFiles denota o número máximo de arquivos de log que podem ser gravados para um único ciclo de vida do aplicativo. GCLogFileSize especifica o tamanho máximo do arquivo. Finalmente,loggc denota sua localização.

O ponto a ser observado aqui é que há mais dois parâmetros JVM disponíveis (-XX:+PrintGCTimeStampse-XX:+PrintGCDateStamps) que podem ser usados ​​para imprimir o carimbo de data / hora no logGC.

Por exemplo, se quisermos atribuir no máximo 100GC arquivos de log, cada um com um tamanho máximo de 50 MB e quiser armazená-los no local ‘/home/user/log/', podemos usar a sintaxe abaixo:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log

No entanto, o problema é que um encadeamento daemon adicional é sempre usado para monitorar a hora do sistema em segundo plano. Esse comportamento pode criar algum gargalo de desempenho; por isso é sempre melhor não brincar com esse parâmetro na produção.

5. Tratamento de memória insuficiente

É muito comum que um grande aplicativo enfrenteout of memory error que, por sua vez, resulta na falha do aplicativo. É um cenário muito crítico e muito difícil de replicar para solucionar o problema.

É por isso que a JVM vem com alguns parâmetros que despejam a memória heap em um arquivo físico que pode ser usado posteriormente para descobrir vazamentos:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit

Alguns pontos a serem observados aqui:

  • HeapDumpOnOutOfMemoryError instrui a JVM a despejar o heap no arquivo físico no caso deOutOfMemoryError

  • HeapDumpPath denota o caminho onde o arquivo deve ser gravado; qualquer nome de arquivo pode ser fornecido; no entanto, se a JVM encontrar uma tag<pid> no nome, a identificação do processo atual que causa o erro de falta de memória será anexada ao nome do arquivo com o formato.hprof

  • OnOutOfMemoryError é usado para emitir comandos de emergência a serem executados em caso de erro de falta de memória; o comando apropriado deve ser usado no espaço de argumentos cmd. Por exemplo, se quisermos reiniciar o servidor assim que houver falta de memória, podemos definir o parâmetro:

-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit é uma política que limita a proporção do tempo da VM que é gasto em GC antes que um erroOutOfMemory seja lançado

6. 32/64 Bit

No ambiente do SO em que os pacotes de 32 e 64 bits estão instalados, a JVM escolhe automaticamente os pacotes ambientais de 32 bits.

Se quisermos definir o ambiente para 64 bits manualmente, podemos fazer isso usando o parâmetro abaixo:

-d

O bit do sistema operacional pode ser32 ou64. Mais informações sobre isso podem ser encontradashere.

7. Misc

  • -server: habilita “Servidor Hotspot VM”; este parâmetro é usado por padrão em JVM de 64 bits

  • -XX:+UseStringDeduplication:Java 8u20 introduziu este parâmetro JVM para reduzir o uso desnecessário de memória, criando muitas instâncias do mesmoString;, isso otimiza a memória heap reduzindo os valores deString duplicados para uma única matriz char [] global

  • -XX:+UseLWPSynchronization: define a política de sincronização baseada emLWP (Light Weight Process) em vez de sincronização baseada em thread

  • -XX:LargePageSizeInBytes: define o tamanho de página grande usado para o heap Java; leva o argumento em GB / MB / KB; com tamanhos de página maiores, podemos fazer melhor uso dos recursos de hardware de memória virtual; no entanto, isso pode causar tamanhos de espaço maiores paraPermGen, que por sua vez pode forçar a redução do tamanho do espaço de heap Java

  • -XX:MaxHeapFreeRatio: define a porcentagem máxima de heap livre apósGC para evitar o encolhimento.

  • -XX:MinHeapFreeRatio: define a porcentagem mínima de heap livre apósGC para evitar expansão; para monitorar o uso de heap, você pode usarVisualVM enviado com o JDK.

  • -XX:SurvivorRatio: proporção deeden /survivor space size - por exemplo,-XX:SurvivorRatio=6 define a proporção entre cadasurvivor space eeden space para ser 1: 6,

  • -XX:+UseLargePages: use memória de página grande se for suportada pelo sistema; observe queOpenJDK 7 tende a travar se usar este parâmetro JVM **

  • -XX:+UseStringCache: ativa o armazenamento em cache de strings comumente alocadas disponíveis no poolString **

  • -XX:+UseCompressedStrings: use um tipobyte[] para objetosString que podem ser representados em formato ASCII puro

  • -XX:+OptimizeStringConcat: otimiza as operações de concatenaçãoString sempre que possível **

8. Conclusão

Neste artigo rápido, aprendemos sobre alguns parâmetros importantes da JVM - que podem ser usados ​​para ajustar e melhorar o desempenho geral do aplicativo.

Alguns deles também podem ser usados ​​para fins de depuração.

Se você deseja explorar os parâmetros de referência em mais detalhes, você pode começarhere.