Aumentando o tamanho máximo de heap JVM para aplicativos com uso intensivo de memória

88

Preciso executar um aplicativo Java com uso intensivo de memória que usa mais de 2 GB, mas estou tendo problemas para aumentar o tamanho máximo do heap. Até agora, tentei as seguintes abordagens:

  • Configurando o parâmetro -Xmx, por exemplo, -Xmx3000m. Essa abordagem falha na criação da JVM. Pelo que pesquisei no Google, parece que -Xmx deve ser inferior a 2 GB.

  • Usando a opção -XX: + AggressiveHeap . Quando tento essa abordagem, recebo um erro 'Memória insuficiente' que indica que o tamanho do heap é 1273,4 MB, embora meu computador tenha 8 GB de memória.

Existe outra abordagem que eu possa tentar aumentar o tamanho máximo de heap da JVM? Aqui está um resumo das especificações do computador:

  • SO: Windows 7 (64 bits)
  • Processador: Intel Core i7 (2,66 GHz)
  • Memória: 8 GB
  • java -version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
Alceu Costa
fonte
7
BTW: O tamanho mínimo e máximo da memória agora são opções padrão. Você pode usar -ms e -mx em vez de -Xms e -Xmx. -X ?? está reservado para opções não padrão.
Peter Lawrey
2
Padrão para qual JVM? Eles ainda não são padrão para o HotSpot JVM (a partir de 1.8). Consulte docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle
-mx e -ms existem e funcionam, mas não consigo encontrá-los na documentação oficial do java @PeterLawrey> você pode adicionar um link para a documentação? Obrigado
Michal Bernhard
2
@MichalBernhard é compatibilidade com versões anteriores do Java 1.1. Eu vi documentado para essa versão, mas pode ser difícil de encontrar agora. ;)
Peter Lawrey
1
Obrigado @PeterLawrey pela explicação. Mas quando você diz que agora é padrão, quer dizer que é padrão do Java 1.1 (mas não é um documento nas versões posteriores)? Parece estranho :) btw encontrei o link na documentação do Java 1.1 e você está certo: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Respostas:

47

Obtenha uma JVM de 64 bits da Oracle .

Presidente James K. Polk
fonte
1
Funcionou para mim :-) Executando o aplicativo usando -Xmx4g e sem problemas até agora.
Alceu Costa
96

Quando você está usando JVM no modo de 32 bits, o tamanho máximo de heap que pode ser alocado é 1280 MB. Portanto, se você quiser ir além disso, precisará invocar a JVM no modo 64.

Você pode usar o seguinte:

$ java -d64 -Xms512m -Xmx4g HelloWorld

Onde,

  • -d64: Ativará JVM de 64 bits
  • -Xms512m: Irá definir o tamanho de heap inicial como 512 MB
  • -Xmx4g: Irá definir o tamanho máximo de heap como 4 GB

Você pode sintonizar -Xms e -Xmx conforme seus requisitos (YMMV)

Um recurso muito bom sobre ajuste de desempenho de JVM, que você pode querer dar uma olhada em: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

Mohitsoni
fonte
Minha JVM é de 32 bits e permite no máximo -Xmx1024M. Também vou tentar a versão de 64 bits.
kiltek de
Eu tentei JVM 64 bits e funcionou perfeitamente. Agora posso definir 4.096 MB de tamanho máximo de heap. Quando você tem 32 e 64 bits instalados, pelo menos no Windows você precisa apontar o caminho Java para seus aplicativos para a nova versão de 64 bits instalada. Caso contrário, o erro persistirá. No Windows, isso geralmente pode ser feito alterando o caminho Java nas Variáveis ​​de Ambiente do sistema.
Fabiano
Acho que o limite para o heap máximo não é 1280, mas algo próximo a 1700 MB. Usei 1600 MB de heap máximo na instalação da JVM de 32 bits e funcionou bem.
Fabiano
qual é o argumento HelloWorld em seu comando? como posso usar este comando se quiser definir o máximo de um processo Java que é iniciado com o comando java -jar myApp.jar no Linux?
LordScone
Olá, posso perguntar qual é o tamanho máximo de heap de java que posso definir? Quando executo o aplicativo, o padrão -Xmx em minha máquina é 4 GB, mas posso definir para mais de 4 GB?
Ock
14

Acredito que o limite de 2 GB seja para Java de 32 bits. Pensei que a v1.6 era sempre de 64 bits, mas tente forçar o modo de 64 bits só para ver: adicione a opção -d64.

G__
fonte
A opção -D64 não funcionou, vou tentar usar a JVM de 64 bits como GregS sugeriu e relatar os resultados.
Alceu Costa
1
As opções -d64 e -d32 funcionam corretamente apenas no Solaris (pelo menos de acordo com esta documentação): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach
Tentei com as duas opções. Com -d64, a JVM falha ao iniciar, mesmo se eu não especificar a opção Xmx. O -D64 só funciona quando não especifico o Xmx.
Alceu Costa
@Lukasz -d64 e -d32 também parecem funcionar no JVM da Apple. Mas esse documento parece implicar que eles não são funcionais para as JVMs Windows e Linux da Sun.
G__
8

Java de 32 bits é limitado a aproximadamente 1,4 a 1,6 GB.

FAQ de heap Oracle de 32 bits

Citar

O limite máximo teórico de heap para a JVM de 32 bits é 4G. Devido a várias restrições adicionais, como troca disponível, uso do espaço de endereço do kernel, fragmentação da memória e sobrecarga da VM, na prática o limite pode ser muito menor. Na maioria dos sistemas Windows de 32 bits modernos, o tamanho máximo de heap irá variar de 1,4 G a 1,6 G. Em kernels Solaris de 32 bits, o espaço de endereço é limitado a 2G. Em sistemas operacionais de 64 bits executando a VM de 32 bits, o tamanho máximo de heap pode ser maior, chegando a 4G em muitos sistemas Solaris.

Jean B
fonte
4

A configuração abaixo funciona para mim:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
tutorial por exemplo
fonte