Força a alocação de memória para Java VM no Windows 7 de 32 bits

0

Como posso iniciar um programa Java com um grande heap máximo?

Eu uso um programa de hog de memória (CrashPlan) escrito em Java, que às vezes, no pico de uso, precisa de cerca de 1,5 GB de memória (isso é controlado pelo parâmetro -Xmx1500M).

Normalmente (e pelo menos ao iniciar) ele precisa de pouca memória, mas com qualquer coisa menor que -Xmx1500M ele falha no pico de uso. Após o início (com -Xmx1000M), o Gerenciador de Tarefas mostra seu uso de memória de cerca de 100 MB em Conjunto de Trabalho, Conjunto Privado e Memória Atribuída.

No entanto, o Java VM não pode iniciar com -Xmx1500M, acho que porque não aloca essa memória. (Com -Xmx1000M ele inicia, mas trava mais tarde).

Eu uso o Windows 7 pro de 32 bits (não 64 bits), com 32 GB de memória instalada (3 GB acessíveis e arquivo de paginação em um grande disco RAM em memória inacessível).

Eu esperaria que o Windows trocasse outros processos para alocar memória para Java e, como o Java não a utiliza de qualquer maneira, trocaria a memória não utilizada do Java pelo arquivo de paginação. Dizer, agora eu vejo processo mydefrag usando 1700 MB alocado set sem nenhum problema.

(Parece até a semana passada que funcionou dessa forma. Então, algo mudou.)

Como posso forçar o Java a começar com -Xmx1500M?

    
por Alexander Gelbukh 03.07.2016 / 21:36

1 resposta

1

Como você já percebeu, a memória endereçável do seu processo de usuário é limitada a 2 GB em janelas de 32 bits (metade do espaço de endereço de 4 GB é reservado para o sistema operacional). Mas você também deve levar em conta que a memória heap não é o único tipo de memória que o Java-VM usa: também há requisitos para alocações nativas de memória, espaço de pilha, perm-gen, cache de código, etc. para vir dos mesmos 2GB que estão disponíveis. Portanto, o tamanho máximo exato do heap pode variar entre as versões java (talvez até mesmo entre computadores diferentes), mas de acordo com o Oracle

On most modern 32-bit Windows systems the maximum heap size will range from 1.4G to 1.6G.

Assim, para qualquer coisa que precise de 1,5 GB de tamanho, você pode estar sem sorte em uma JVM de 32 bits (e assim por diante em um sistema operacional de 32 bits).

Você pode ganhar MB adicional reduzindo outros conjuntos de memória, por exemplo definindo -XX:ReservedCodeCacheSize (padrão 32m) ou -XX:MaxPermSize (padrão 64m), mas isso pode levar a outros problemas durante a execução do aplicativo.

    
por 04.07.2016 / 10:43