Se eu omitir a -Xmxn
opção da linha de comando Java, um valor padrão será usado. De acordo com a documentação Java
"o valor padrão é escolhido no tempo de execução com base na configuração do sistema"
Quais configurações do sistema influenciam o valor padrão?
java
heap
heap-memory
Richard Dorman
fonte
fonte
Respostas:
No Windows, você pode usar o seguinte comando para descobrir os padrões no sistema em que seus aplicativos são executados.
Procure as opções
MaxHeapSize
(para-Xmx
) eInitialHeapSize
para-Xms
.Em um sistema Unix / Linux, você pode fazer
Eu acredito que a saída resultante é em bytes.
fonte
InitialHeapSize = 262803264
eMaxHeapSize = 4206886912
que tem cerca de 256 MB e 4 GB, se não me engano. Isso significa que toda JVM inicia como se tivesse sido lançada com-Xms256m -Xmx4g
opções?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
suprime o longo "uso" do textostderr
.Para Java SE 5: de acordo com a ergonomia do coletor de lixo [Oracle] :
ATUALIZAR:
Como apontado por Tom Anderson em seu comentário, o acima é para máquinas de classe de servidor. Da ergonomia na máquina virtual JavaTM 5.0 :
fonte
Java 8 leva mais de 1/64 de sua memória física para o seu xmssize (HEAPSIZE mínima) e menos de 1 / 4th de sua memória física para o seu -Xmxsize (Maximum HEAPSIZE).
Você pode verificar o tamanho padrão do heap Java :
No Windows :
No Linux :
A memória física da máquina e a versão Java.
fonte
Isso foi alterado na atualização 18 do Java 6 .
Supondo que tenhamos mais de 1 GB de memória física (bastante comum atualmente), é sempre 1/4 da sua memória física para o servidor vm.
fonte
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Ernesto está certo. De acordo com o link que ele postou [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
fonte
Para o IBM JVM, o comando é o seguinte:
Para obter mais informações sobre o IBM SDK para Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = pt
fonte
Finalmente!
A partir do Java 8u191, agora você tem as opções:
que pode ser usado para dimensionar o heap como uma porcentagem da RAM física utilizável. (que é o mesmo que a RAM instalada menos o que o kernel usa).
Consulte as Notas da versão do Java8 u191 para obter mais informações. Observe que as opções são mencionadas em um cabeçalho do Docker, mas na verdade elas se aplicam se você estiver no ambiente do Docker ou em um ambiente tradicional.
O valor padrão para
MaxRAMPercentage
é 25%. Isso é extremamente conservador.Minha própria regra: se o seu host é mais ou menos dedicado à execução do aplicativo java fornecido, você pode, sem problemas, aumentar drasticamente. Se você estiver no Linux, executando apenas daemons padrão e tiver instalado RAM a partir de 1 Gb ou mais, não hesitaria em usar 75% para o heap da JVM. Novamente, lembre-se de que isso representa 75% da RAM disponível , não a RAM instalada . O que resta são os outros processos de terra do usuário que podem estar em execução no host e os outros tipos de memória que a JVM precisa (por exemplo, para a pilha). No conjunto, isso normalmente se encaixa perfeitamente nos 25% restantes. Obviamente, com ainda mais RAM instalada, os 75% são uma aposta mais segura. (Eu gostaria que o pessoal do JDK tivesse implementado uma opção em que você pudesse especificar uma escada)
Definir a
MaxRAMPercentage
opção fica assim:Observe que esses valores percentuais são do tipo 'duplo' e, portanto, você deve especificá-los com um ponto decimal. Você recebe um erro um tanto estranho se usar "75" em vez de "75.0".
fonte
Dê uma olhada na página de documentação
Tamanhos de heap inicial e máximo padrão da JVM do cliente:
O tamanho máximo de heap padrão é metade da memória física até 192 megabytes (MB) e, caso contrário, um quarto da memória física até 1 gigabyte (GB) .
Tamanhos de heap inicial e máximo padrão da JVM do servidor:
Nas JVMs de 32 bits, o tamanho máximo de heap padrão pode ser de até 1 GB se houver 4 GB ou mais de memória física . Nas JVMs de 64 bits, o tamanho máximo de heap padrão pode ser de até 32 GB se houver 128 GB ou mais de memória física
Você pode especificar os tamanhos de heap inicial e máximo usando os sinalizadores -Xms (tamanho de heap inicial) e -Xmx (tamanho de heap máximo). Se você sabe quanto heap seu aplicativo precisa para funcionar bem, você pode definir -Xms e -Xmx com o mesmo valor
fonte
O sinalizador
Xms
eXmx
é da Java virtual machine (JVM):Xms
:initial and minimum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:-server
modo: 25% de memória física livre,> = 8MB e <= 64MB-client mode
: 25% de memória física livre,> = 8MB e <= 16MBTypical Size
:-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
tamanho de memóriaXmx
:maximum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:<= R27.2
Windows
:75%
da memória física total até1GB
Linux/Solaris
:50%
de memória física disponível até1GB
>= R27.3
Windows X64
:75%
da memória física total até2GB
Linux/Solaris X64
:50%
de memória física disponível até2GB
Windows x86
:75%
da memória física total até1GB
Linux/Solaris X86
:50%
de memória física disponível até1GB
Typical Size
:-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/Effect
:Xmx
memória de tamanhoXmx
, serájava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
valor-Xmx4g
para-Xmx8g
Mais detalhes
consulte o documento oficial: -X Opções da linha de comando
fonte
Vários parâmetros afetam o tamanho da geração. O diagrama a seguir ilustra a diferença entre espaço confirmado e espaço virtual no heap. Na inicialização da máquina virtual, todo o espaço para o heap é reservado. O tamanho do espaço reservado pode ser especificado com a
-Xmx
opção Se o valor do-Xms
parâmetro for menor que o valor do-Xmx
parâmetro, nem todo o espaço reservado será imediatamente comprometido com a máquina virtual. O espaço não confirmado é rotulado como "virtual" nesta figura. As diferentes partes da pilha (geração permanente, geração assegurada e geração jovem) podem crescer até o limite do espaço virtual, conforme necessário.Por padrão, a máquina virtual aumenta ou diminui o heap em cada coleção para tentar manter a proporção de espaço livre para viver objetos em cada coleção dentro de um intervalo específico. Esse intervalo de destino é definido como uma porcentagem pelos parâmetros -
XX:MinHeapFreeRatio=<minimum>
e-XX:MaxHeapFreeRatio=<maximum>
, e o tamanho total é limitado abaixo por-Xms<min>
e acima de-Xmx<max>
.Valor padrão do parâmetro
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
Os valores padrão dos parâmetros de tamanho de heap em sistemas de 64 bits foram aumentados em aproximadamente 30%. Esse aumento visa compensar o tamanho maior de objetos em um sistema de 64 bits.
Com esses parâmetros, se a porcentagem de espaço livre em uma geração cair abaixo de 40%, a geração será expandida para manter 40% de espaço livre, até o tamanho máximo permitido da geração. Da mesma forma, se o espaço livre exceder 70%, a geração será contratada para que apenas 70% do espaço seja livre, sujeito ao tamanho mínimo da geração.
Aplicativos de servidor grandes geralmente enfrentam dois problemas com esses padrões. Uma é a inicialização lenta, porque o heap inicial é pequeno e deve ser redimensionado em muitas coleções principais. Um problema mais urgente é que o tamanho máximo padrão do heap é excessivamente pequeno para a maioria dos aplicativos de servidor. As regras práticas para aplicativos de servidor são:
Em geral, aumente a memória à medida que aumenta o número de processadores, pois a alocação pode ser paralelizada.
Existe o artigo completo
fonte