Java Memory Heap
Java Memory Heap é um dos subsistemas gerenciados pela JVM, a sua função é gerir o uso de memória da JVM.
Definindo o tamanho de heap
Por padrão o java não irá utilizar toda a mémoria disponível, nem mesmo metade disso, mas sim seguirá o processo do Java Ergonomics. Por esse motivo é de suma importância definirmos manualmente a quantidade de memória que queremos que a JVM utilize, caso contrário, vamos acabar pagando por recursos que nunca serão utilizados.
Podemos definir o tamanho do heap utilizando os seguintes parâmetros:
# primeiro modo - estático:
-Xms512m # tamanho inicial
-Xmx4g # tamanho máximo, até onde irá expandir
# segundo modo - por percentual:
-XX:InitialRAMPercentage=10 # tamanho inicial
-XX:MaxRAMPercentage=70 # tamanho máximo, até onde irá expandir
Há outro parâmetro chamado -XX:MinRAMPercentage, que apesar do seu nome, não tem a função de definir o tamanho mínimo do heap, mas sim o tamanho máximo para heaps inferiores a 200Mb (estranho, eu sei). Veja mais sobre.
Habilitando NUMA
Em resumo, Numa é uma tecnologia que visa reduzir a latência do acesso da CPU à mémoria. Felizmente, Java possui suporte a essa tecnologia e podemos tirar proveito para conseguir mais velocidade para nossas aplicações.
Antes de habilitarmos o NUMA, precisamos verificar se a maquina atual possui suporte:
numactl --hardware
Você deve receber uma saída similar a essa:
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
node 0 size: 15755 MB
node 0 free: 1747 MB
node distances:
node 0
0: 10
Não, a grande maioria das distribuições linux já vem com o numactl incluso.
Então você pode habilitar o NUMA com a tag:
-XX:+UseNUMA
Deduplicação de objetos string
A deduplicação é uma feature da JVM que evita o armazenamento de objetos String iguais, assim, reduzindo o uso de mémoria da sua aplicação.
Você pode habilitar a deduplicação de string utilizando a tag:
-XX:+UseStringDeduplication
Habilitar a deduplicação irá diminuir o uso de mémoria da sua aplicação, em contrapartida, irá aumentar o uso de CPU.
Memória virtual e física - AlwaysPreTouch
A JVM aloca o heap na memória virtual em vez da memória física, então, gradualmente ela irá alocar as paginas na memória física. Podemos alterar esse comportamento forçando o Java a alocar o heap diretamente na memória física, para isso utilizamos a tag:
-XX:+AlwaysPreTouch
Utilizar o parâmetro "AlwaysPreTouch" irá melhorar o desempenho da sua aplicação, em contrapartida, o tempo de inicialização pode ser severamente afetado. Um bom uso para esse parâmetro é utilizar ele em testes de estresse, onde antecipadamente, logo na inicialização, replicamos o cenário produtivo onde a JVM já alocou todo o heap na memória física.
- Java Large Pages
- Head Dump e Head Dump Path
- Resize Policy