Pergunta

eu começar o meu código java (1.6.0_16 no Vista) com os seguintes parâmetros (entre outros) -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs. Eu executar o código e eu posso ver nos logs existem dois OOM.

O primeiro que eu sei porque eu posso ver na stdout que o arquivo hprof está sendo criado:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to ../logs\java_pid4604.hprof ...
Heap dump file created [37351818 bytes in 1.635 secs]

E, em seguida, para o final do código que eu conseguir outro OOM, eu capturar isso, mas eu não receber um segundo arquivo hprof criado. Alguém sabe por que é isso ?? É porque eu ter capturado a exceção OOM?

Foi útil?

Solução

Sem memória gera apenas um arquivo de despejo no primeiro erro. Se você quiser obter mais você pode tentar jmap ou manter jconsole na JVM (versão 6), então você pode depois de tudo caiu ou seja na parte da manhã criar seu próprio despejo de jconsole (ou sua ferramenta de analisador de escolha).

Mais sobre o assunto despejo pode ser lido em Eclipse MemoryAnalyser .

Outras dicas

Eu não iria tentar recuperar de uma OutOfMemoryError como alguns objetos pode acabar em um estado indefinido (só de pensar um ArrayList que não pôde alocar a sua matriz para data store por exemplo).

Quanto à sua pergunta, eu suspeito que -XX: + HeapDumpOnOutOfMemoryError só é a criação de um único despejo intencionalmente para evitar múltipla pilha despejos: basta pensar sobre vários tópicos jogando um OOME, ao mesmo tempo, causando um despejo de pilha para cada jogado exceção.

Como um resumo: não tente recuperar de OOME e não esperar que a JVM para escrever mais de um despejo de pilha. No entanto, se você ainda se sente a necessidade de gerar um despejo de pilha, você poderia tentar lidar com manualmente uma exceção OOME e jmap chamada para criar um despejo ou o uso "-XX: + HeapDumpOnCtrlBreak" (não tenho certeza, porém, como simular CtrlBreak programaticamente) .

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