Quais são os parâmetros -Xms e -Xmx ao iniciar a JVM?

1008

Por favor, explique o uso de Xmse Xmxparâmetros nas JVMs. Quais são os valores padrão para eles?

Pankaj
fonte
2
quando se utiliza -Xmx128m -Xms64mpode pico em torno 275mRES mem, mas quando se utiliza -Xmx128m -Xms128mpode pico em torno 550mRES mem Usando Java 8 Melhor coisa é de salientar a GC e olhar para o que acontece ...
Christophe Roussy

Respostas:

1360

O sinalizador Xmxespecifica o conjunto máximo de alocação de memória para uma Java virtual machine (JVM), enquanto Xmsespecifica o conjunto inicial de alocação de memória.

Isso significa que sua JVM será iniciada com Xmsquantidade de memória e poderá usar o máximo de Xmxquantidade de memória. Por exemplo, iniciar uma JVM como a seguir, iniciará com 256 MB de memória e permitirá que o processo use até 2048 MB de memória:

java -Xms256m -Xmx2048m

O sinalizador de memória também pode ser especificado em tamanhos diferentes, como kilobytes, megabytes e assim por diante.

-Xmx1024k
-Xmx512m
-Xmx8g

O Xmssinalizador não tem valor padrão e Xmxnormalmente possui um valor padrão de 256 MB. Um uso comum para esses sinalizadores é quando você encontra umjava.lang.OutOfMemoryError .

Ao usar essas configurações, lembre-se de que essas configurações são para o heap da JVM e que a JVM pode / utilizará mais memória do que apenas o tamanho alocado para o heap. Da documentação da Oracle :

Observe que a JVM usa mais memória do que apenas a pilha. Por exemplo, métodos Java, pilhas de encadeamentos e identificadores nativos são alocados na memória separada do heap, bem como nas estruturas de dados internas da JVM.

hexacianida
fonte
12
Assim, quando o uso da memória excede o Xmx, obtemos o jvm com exceção da memória.
Pankaj
59
Sim esta correto. Quando tenta exceder isso, embora possa coletar lixo para tentar liberar memória suficiente. Se ainda não houver memória suficiente para atender à solicitação e o heap já tiver atingido o tamanho máximo, OutOfMemoryErrorisso ocorrerá.
David Conrad
2
Quando estou usando a estrutura ForkJoin, meu computador trava porque está consumindo muita memória. É possível que no OpenJDK não haja limite rígido na memória por padrão?
Christophe De Troyer
6
Conforme esclarecido em java -Xmx 1G significa 1 GB ou 2 ^ 30 B? , a maneira inequívoca de expressar quanta memória você começa com via -Xms256mé "256 MiB", não "256 MB", pois utiliza potências binárias em vez de potências de dez. Veja en.wikipedia.org/wiki/Binary_prefix . Além disso, porque algum espaço inutilizável é reservado para uma piscina extra de espaço Survivor, a quantidade de memória realmente disponível de acordo com Runtime.getRuntime().maxMemory()é menor do que o valor especificado através de -Xmx
nealmcb
1
Um guia útil de erros comuns relacionados ao tamanho da pilha: blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size
ctrlplusb
315

Execute o comando java -Xe você obterá uma lista de todas as -Xopções:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

As opções -X não são padrão e estão sujeitas a alterações sem aviso prévio.

Espero que isso ajude você a entender Xms, Xmxassim como muitas outras coisas que mais importam. :)

Rupesh Yadav
fonte
1
Aprendi um novo comando hoje, obrigado @RupeshYadav
jumping_monkey 14/12/19
18

Você pode especificá-lo em seu IDE. Por exemplo, para Eclipse em Executar configuraçõesargumentos da VM . Você pode entrar -Xmx800m -Xms500mcomo

Digite a descrição da imagem aqui

Mehrez BEN MOHAMED
fonte
No RubyMine no OSX, está no menu Ajuda> Editar opções personalizadas da VM.
Jon Schneider
8
Isso não responde à pergunta. A questão é sobre para que servem, não como defini-los.
Captain Man
@Hearen Como se separar em intellij ??
13

A questão em si já foi abordada acima. Apenas adicionando parte dos valores padrão.

Conforme http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

O valor padrão de Xmx dependerá da plataforma e da quantidade de memória disponível no sistema.

Abhishek Aich
fonte
8
Para outros JVMs (além JRockit), veja este post para determinar valores de sua JVM XMX / Xms padrão: stackoverflow.com/questions/4667483/...
Ogre Psalm33
3

-Xms tamanho de heap inicial para a inicialização, no entanto, durante o processo de trabalho, o tamanho de heap pode ser menor que -Xms devido à inatividade dos usuários ou iterações de GC. Esse não é um tamanho mínimo necessário de heap.

-Xmx tamanho máximo de heap

Lazylead
fonte