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.