Posso definir o tamanho de heap máximo do Java para execução a partir de um arquivo jar?

Eu estou lançando um arquivo java jar que muitas vezes requer mais do que o tamanho de heap padrão de 64 MB. Um tamanho de heap de 256 MB é suficiente para este aplicativo. Existe alguma maneira de especificar (no manifesto talvez?) Sempre usar um tamanho de heap máximo de 256 MB ao iniciar o jar? (Detalhes mais específicos abaixo, se necessário.)


Este é um aplicativo de linha de comando que eu escrevi em Java, que faz alguma manipulação de imagem. Em imagens de alta resolução (cerca de 12 megapixels e acima, o que não é incomum), recebo um OutOfMemoryError.

Atualmente estou lançando o aplicativo de um arquivo jar, ou seja

java -jar MyApp.jar params...

Eu posso evitar um OutOfMemoryError especificando um tamanho de heap máximo de 256 MB na linha de comando, ou seja:

java -Xmx256m -jar MyApp.jar params...

No entanto, eu não quero ter que especificar isso, pois sei que 256MB é suficiente, mesmo para imagens de alta resolução. Eu gostaria de ter essas informações salvas no arquivo jar. Isso é possível?

você também pode usar um wrapper como o launch4j que tornará um executável para a maioria dos sistemas operacionais e permitirá que você especifique opções de VM.

Escreva um lote ou script de shell contendo a seguinte linha. Coloque na pasta, onde MyApp.jar é armazenado.

 java -Xmx256M -jar MyApp.jar 

Depois disso, sempre abra esse arquivo de lote / script para ativar o arquivo JAR. Embora isso não incorpore a especificação do tamanho da memory virtual no próprio arquivo jar. Mas, pode replace o problema para escrever o mesmo comando, muitas vezes na linha de comando.

Eu tive uma necessidade semelhante, e pensei que deveria ser capaz de especificar isso no manifesto, como sugerido acima. No entanto, isso não é possível. Minha solução é semelhante ao que o Alex sugeriu acima, no entanto, o que fiz foi ter o método principal usando o ProcessBuilder do Java para iniciar outro processo Java. Ao iniciar outro processo, você pode especificar a memory máxima para o novo processo. Você está essencialmente tendo um processo Java iniciando outro. É um pouco piegas, mas funciona e ainda permite que você inicie seu aplicativo clicando duas vezes no arquivo Jar, que eu sei que você quer fazer. Olhe para o ProcessBuilder.

Isso não é ótimo, mas você poderia tê-lo como um JAR executável e, em seguida, no seu principal, executá-lo através da linha de comando como um thread não-daemon com os parâmetros apropriados armazenados em um arquivo de propriedades ou calculado ou qualquer e saia do original. Você poderia até mesmo executar o jar com outro ponto de input “real” que espera esses parâmetros.

Encontrei uma resposta no google.

Ele diz que não para o arquivo JAR, sim no JavaWeb Start, e que você deve fazê-lo em seu script / aplicativo / wrapper (possivelmente específico do sistema).

SIM! Você precisa escrever um pequeno programa de arranque – eu escrevi um pequeno programa compatível com a plataforma cruzada (caminhos devem ser bons) para fazê-lo – veja abaixo. Isso foi testado no Windows / Ubuntu / Mac OS X.

Artigo do Blog do Silent Development sobre o aumento do heap Java jar executável

Aparentemente isso funciona no Ubuntu

 > export _JAVA_OPTIONS="-Xmx1g" 

java -jar jconsole.jar & Capturado _JAVA_OPTIONS: -Xmx1g

Existem muitas maneiras de fazer isso:

Você pode ter outro arquivo Jar que aciona seu Jar principal.

Ou, tenha um arquivo de lote que iniciará seu jar. Mas tenha cuidado, se baixado do say net, o usuário terá que definir permissions para o script ser executável

Construa um instalador. No Mac, usando o empacotador do Oracle Java App para Java 7, o empacotador do Apple App para Java 6 cria o arquivo .app. Você ainda não pode redistribuí-lo, pois as permissions necessárias não serão definidas. Crie um dmg para o arquivo do aplicativo. Isso pode ser usado para distribuição. Um instalador semelhante para o Windows

A terceira técnica seria a melhor, pois você pode empacotar bem as dependencies, definir todos os argumentos da JVM, etc.