Muito estranho OutOfMemoryError

Como sempre, uma longa descrição do problema.

Atualmente, estamos testando o estresse de nossos produtos - e agora enfrentamos um problema estranho. Depois de uma a duas horas, o espaço do heap começa a crescer, o aplicativo morre algum tempo depois.

A criação de perfil do aplicativo mostra uma quantidade muito grande de objetos Finalizador, preenchendo o heap. Bem, nós pensamos que "pode ​​ser o thread de finalizador estranho para retardar" problema e revisado para reduzir a quantidade de objetos que precisam ser finalizados (identificadores nativos de JNA neste caso). Boa ideia e reduziu milhares de novos objetos ...

Os próximos testes mostraram o mesmo padrão, apenas uma hora depois e não tão íngreme. Desta vez, os Finalizadores foram originados dos fluxos FileInput e FileOutput que são muito usados ​​no testbed. Todos os recursos estão fechados, mas os finalizadores não são mais limpos.

Eu não tenho idéia porque depois de 1 ou 2 horas (sem exceções) o FinalizerThread parece de repente parar de funcionar. Se forçarmos System.runFinalization () manualmente em alguns dos nossos threads, o criador de perfil mostra que os finalizadores estão limpos. Retomando o teste imediatamente faz com que nova alocação de heap para finalizadores.

O FinalizerThread ainda está lá, perguntando ao jConsole que ele está ESPERANDO.

EDITAR

Primeiro, inspecionar o heap com o HeapAnalyzer não revelou nada de novo / estranho. HeapAnalyzer tem alguns recursos legais, mas eu tive minhas dificuldades no começo. Eu estou usando jProfiler, que vem junto com ferramentas de inspeção de pilha e vai ficar com ele.

Talvez eu esteja perdendo alguns recursos matadores no HeapAnalyzer?

Segundo, hoje nós configuramos os testes com uma conexão de depuração ao invés do perfilador - o sistema está estável por quase 5 horas agora. Esta parece ser uma combinação muito estranha de muito Finalizers (que foram reduzidos na primeira revisão), o profiler e as estratégias de GC de VM. Como tudo corre bem no momento, não há insights reais ...

Obrigado pela entrada até agora - talvez você fique atento e interessado (agora que você pode ter mais razões para acreditar que não falamos sobre uma simples falha de programação).

questionAnswers(6)

yourAnswerToTheQuestion