Pergunta

Temos um programa java que requer uma grande quantidade de espaço de pilha - começamos com (entre outros argumentos de linha de comando) o argumento -Xmx1500m, que especifica um espaço máximo de heap de 1500 MB. Ao iniciar este programa em uma caixa de Windows XP que foi recentemente reiniciado, ele irá iniciar e executar sem problemas. Mas se o programa foi executado várias vezes, o computador tem sido até por um tempo, etc., quando ele tenta iniciar eu recebo este erro:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Eu suspeito que o próprio Windows está sofrendo de fragmentação de memória, mas eu não sei como confirmar essa suspeita. No momento em que isso acontece, gerenciador de tarefas e sysinternals Procexp relatório 2000MB de memória livre. Eu olhei esta questão relacionada com a fragmentação interna

Assim, a primeira pergunta é: Como posso confirmar a minha suspeita? A segunda questão é que, se minhas suspeitas estiverem corretas, alguém sabe de todas as ferramentas para resolver este problema? Eu olhei ao redor um pouco, mas eu não encontrei qualquer coisa que ajude, diferente de reinicializações periódicas da máquina.

ps - mudar os sistemas operacionais também não é atualmente uma opção viável.

Foi útil?

Solução

Concordo com Torlack, muito disso é porque outras DLLs estão sendo carregados e entrar em determinados pontos, quebrando-se a quantidade de memória que você pode obter para a VM em um grande bloco.

Você pode fazer algum trabalho em WinXP, se você tiver mais de 3G de memória para obter algumas das janelas stuff movimentados, olhar para cima PAE aqui: http://www.microsoft.com/whdc/system/ plataforma / servidor / PAE / PAEdrv.mspx

Sua melhor aposta, se você realmente precisa mais de 1.2G de memória para o seu aplicativo java, é olhar para 64 bits do Windows ou Linux ou OSX. Se você estiver usando qualquer tipo de bibliotecas nativas com seu aplicativo você vai ter que recompilar-los para 64 bits, mas que vai ser muito mais fácil do que tentar rebase dlls e outras coisas para maximizar a memória que você pode obter em 32 bits do Windows .

Outra opção seria a de dividir o seu programa até em várias VMs e tê-los se comunicar uns com os outros através de RMI ou mensagens ou algo assim. Dessa forma, cada VM pode ter algum subconjunto da memória que você precisa. Sem saber o que seu aplicativo faz, não tenho certeza de que isso vai ajudar de alguma forma, embora ...

Outras dicas

A menos que você está funcionando fora do espaço de arquivo de paginação, esta questão não se o computador está ficando sem memória é. O ponto inteiro de memória virtual é permitir que os processos de usar mais memória virtual do que está fisicamente disponível.

Não sabendo como a JVM manipula a pilha, é um pouco difícil dizer exatamente qual é o problema, mas um dos problemas comuns é que não há suficiente espaço de endereço livre contíguo disponível no seu processo para permitir que a pilha para ser estendida. Por que isso seria um problema após a máquina ter sido correndo um tempo é um pouco confuso.

Eu tenho trabalhado em um problema semelhante no trabalho. Eu descobri que executam o programa usando WinDBG e usando o "endereço!" E comandos "! Endereço -summary" têm sido inestimável para rastrear por espaço de endereço virtual de um tratamento tornou-se fragmentado. Você também pode tentar executar o programa após a reinicialização e usando o comando "endereço" para tirar uma foto do espaço de endereços e, em seguida, fazer o mesmo quando o programa não é executado. Esta força você na pista sobre o problema. Talvez algo simples como um DLL adicional obtenção de carga pode causar o problema.

Eu suspeito que o problema é o Windows fragmentação de memória. Há uma outra pergunta aqui no StackOverflow chamado Java Memória Máxima no Windows XP que menciona usando o Process Explorer para olhar para onde DLLs são mapeados na memória e, em seguida, para resolver o problema por rebasing as DLLs para que carregar na memória de uma forma mais compacta.

Usando Minimem ( http://minimem.kerkia.net/ ) para esse aplicativo pode corrigir o seu problema. No entanto, eu não tenho certeza que esta é a resposta que você está procurando. Espero que ajude.

Talvez você deve considerar para iniciar o programa e reservando a memória e não terminar a VM após cada ensaio. Olhar para diferentes opções de GC e liberar seus objetos.

Use VMMap de ferramentas SysInternals da Microsoft para ver a fragmentação do espaço de endereço virtual, e identificar o que está quebrando o espaço

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top