Como definir o uso máximo de memória para a JVM?

132

Eu quero limitar a memória máxima usada pela JVM. Observe que este não é apenas o heap, quero limitar a memória total usada por esse processo.

erotsppa
fonte

Respostas:

94

usar os argumentos -Xms<memory> -Xmx<memory>. Use Mou Gapós os números para indicar Megs e Gigs de bytes, respectivamente. -Xmsindica o mínimo e -Xmxo máximo.

Prabhu R
fonte
1
você também pode querer dar uma olhada no MaxPermSize.
urmalp 30/09/09
89
ele está perguntando sobre a memória da JVM. O que você disse é o tamanho da pilha. Ambos são diferentes
vsingh
8
Para reiterar o que os outros comentários mencionam, o Xms e o Xmx configuram apenas o heap. Embora a configuração dessas variáveis tem um efeito indireto sobre espaço não-heap, a pessoa que faz a pergunta está tentando estabelecer se existe uma maneira de configurar uso de memória total (pilha + non-heap)
murungu
2
uhu. então eu defino -Xmx524Me o processo ocupa 1,2 GB de RAM. (?)
phil294
7
Essa não é a resposta correta, as opções -Xms e -Xmx apenas regulam o tamanho do heap da jvm, não a alocação total de memória.
Peter De Winter
31

Você não precisa se preocupar com o vazamento de memória da pilha (é altamente incomum). O único momento em que você pode deixar a pilha fora de controle é com recursão infinita (ou realmente profunda).

Esta é apenas a pilha. Desculpe, não li sua pergunta completamente no começo.

Você precisa executar a JVM com o seguinte argumento da linha de comandos.

-Xmx<ammount of memory>

Exemplo:

-Xmx1024m

Isso permitirá um máximo de 1 GB de memória para a JVM.

jjnguy
fonte
1
Isso não é verdade, de acordo com esta discussão, existem várias maneiras que você pode vazar fora da pilha stackoverflow.com/questions/1475290/...
erotsppa
Você está correto, existem várias maneiras de ter problemas de memória não relacionados à pilha. No entanto, eles não são muito comuns.
jjnguy
9
Certamente você não pode controlar o tamanho da memória que não é da pilha, pode?
mate b
Certamente você pode controlá-lo via -XX:MaxDirectMemorySize. Não que eu tenha perfilado fortemente para ter certeza, mas ainda;)
alexandergunnarson
2
@alexandergunnarson O MaxDirectMemorySizeúnico afeta os buffers NIO. Todos os tipos de outras memórias nativas são usadas pela JVM.
21418 Christopher Schultz
16

Se você deseja limitar a memória para jvm (não o tamanho do heap) ulimit -v

Para ter uma idéia da diferença entre jvm e memória heap, dê uma olhada neste excelente artigo http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html

vsingh
fonte
8
É ulimitum comando do Linux? Fiz uma pesquisa rápida no Google e não vi nenhuma relação entre ulimite a JVM. Y
Sam
11

A resposta acima é do tipo correta, você não pode controlar normalmente quanta memória nativa um processo java aloca. Depende do que seu aplicativo está fazendo.

Dito isto, dependendo da plataforma, você poderá usar algum mecanismo, por exemplo, ulimit, para limitar o tamanho de um java ou qualquer outro processo.

Só não espere que falhe normalmente se atingir esse limite. As falhas de alocação de memória nativa são muito mais difíceis de tratar do que as falhas de alocação no heap java. Há uma chance razoavelmente boa de o aplicativo travar, mas dependendo de quão crítico é para o sistema manter o tamanho do processo baixo, o que pode ser útil para você.

SmoothieMonster
fonte
1

O NativeHeap pode ser aumentado por -XX: MaxDirectMemorySize = 256M (o padrão é 128)

Eu nunca usei isso. Talvez você ache útil.

Mario Trucco
fonte
1
Duvido que op queria isso: a memória nativa é usada quando você faz uma chamada para o código C / C ++ em java.
Om-nom-nom
6
a memória nativa também é usada ao fazer chamadas nio se você alocar os buffers com memória direta. (... e classloaders e informações fio ....)
stu