Correção: ocorreu um erro durante a inicialização da VM e não foi possível reservar espaço suficiente para a pilha de objetos

Embora os miniaplicativos Java não sejam uma tecnologia da web popular atualmente, há inúmeras razões para implantar uma máquina virtual Java diretamente em um servidor Linux. Se você tentar executar o comando Java do Linux diretamente em hardware discreto ou dentro de sua própria VM, poderá obter a mensagem “ocorreu um erro durante a inicialização da VM não foi possível reservar espaço suficiente para o heap de objeto”.

Isso provavelmente parece um pouco estranho porque você provavelmente tem RAM suficiente para executar o comando, mas é em grande parte devido a uma peculiaridade específica na maneira como as páginas de memória física e virtual são usadas. Especificar alguns tamanhos relativamente grandes deve permitir que você ignore completamente esta mensagem e execute o comando java da maneira que faria com qualquer outro.

Método 1: usando opções de linha de comando

Se você tentou executar java e recebeu esta mensagem, provavelmente já executou o comando free para se certificar de que há um amplo suprimento de memória para executar o programa.

comandos java e gratuitos

Observe que em nossa máquina de teste tínhamos 2,3 GB de RAM física e nenhuma página de memória virtual foi usada ainda. Se você notar que tem problemas de memória, feche outras coisas que você esteja executando antes de tentar novamente. Por outro lado, aqueles que descobriram que têm bastante memória livre podem tentar especificar um tamanho diretamente.

Por exemplo, em nossa máquina, conseguimos executar o comando como java -Xms256m -Xmx512M e funcionou como seria de se esperar. Isso restringe o tamanho do heap que a máquina virtual Java tenta reservar na inicialização. Uma vez que uma máquina virtual desenfreada poderia hipoteticamente fazer coisas incomuns, ela poderia lançar mensagens de erro em um sistema livre. Você também pode querer brincar com esses dois valores antes de encontrar a combinação certa.

Isso pode ser um problema, independentemente do que você está executando, uma vez que a JVM não tem nada a ver com o tipo de VM que você pode estar usando para executar GNU / Linux.

Método 2: exportando as variáveis ​​para tornar a mudança permanente

Ao encontrar um valor que funcione, você pode exportá-lo para torná-lo permanente para aquela sessão. Por exemplo, usamos export _JAVA_OPTIONS = '- Xms256M -Xmx512M' a partir do prompt de comando bash e nos permitiu executar o comando java sozinho, sem nenhuma outra opção, até que desconectássemos de nosso servidor.

Ele precisava ser executado novamente quando efetuamos login em outra sessão, então você pode querer adicioná-lo a quaisquer scripts de inicialização relevantes se você planeja usar o comando java com frequência. Adicionamos a linha ao nosso arquivo .bash_login e parecia funcionar cada vez que usamos um prompt de login sem ter que executá-lo novamente, embora você possa ter que encontrar outro local para ele se estiver trabalhando com um shell diferente.

Você deve ter notado que apenas certas configurações de hardware acionam essa mensagem de erro. Isso porque geralmente acontece em máquinas com uma grande quantidade de RAM física, mas ulimits mais baixos de como usá-la. Java tentará alocar um bloco enorme apenas para ouvir que não pode, o que ele interpreta como ficando sem memória.

Método 3: Imprimir opções Java atuais

Se você tem trabalhado na linha de comando e deseja uma referência rápida para o que você definiu atualmente para o valor _JAVA_OPTIONS, simplesmente execute echo $ _JAVA_OPTIONS e ele imprimirá imediatamente os valores atuais. Isso é útil para solucionar problemas quando você está tentando descobrir os numerais certos para tentar.

Lembre-se de que, embora essa correção não deva exigir nenhuma outra brincadeira, o Java lançará a mensagem "não foi possível reservar espaço suficiente para a pilha de objetos" se você realmente ficar sem memória virtual. Se for esse o caso, você vai querer verificar quais processos estão atualmente em execução e possivelmente reiniciar o servidor, se for uma opção. Você também pode criar mais espaço de troca, mas se isso for um problema, geralmente é melhor tentar corrigi-lo de alguma outra maneira.

No caso raro de suas configurações parecerem corretas, mas ainda não funcionar, certifique-se de ter instalado o pacote Java de 64 bits, pois ele deve ser imune a esse problema. Os requisitos de memória contígua aplicam-se apenas à versão de 32 bits do Java. Encontramos em alguns casos que a versão de 64 bits tentava criar uma máquina virtual de 32 bits, portanto, especificar a opção -d64 na linha de comando corrigiu isso para nós.