Pergunta

Eu tenho um grande gráfico de cenas em Java 3D, composto por um grupo que contém cerca de 3500 interruptores, cada um contendo um Shape3D e um grupo, este último contém mais dois Shape3Ds.

A razão para essa configuração é que cada um dos 3500 comutadores deve estar completamente escondido ou ter um de seus dois filhos visíveis.

O problema ocorre quando tento modificar a geometria dos dois Shape3Ds no grupo em um interruptor. Eu tentei o seguinte:

  • Alterar grupo para BranchGroup. Quando a geometria precisar ser alterada, separo o grupo de ramificação e crie um novo, com geometria atualizada, para substituí -la. Vazamentos enormes quantidades de memória. Por exemplo, o uso inicial da memória será de cerca de 100 MB. Uma mudança na geometria mais tarde é de cerca de 400 MB.

  • Faça a geometria editável. Quando a geometria precisa ser alterada, edito -a diretamente. Vazamentos enormes quantidades de memória. Semelhante ao acima.

  • Faça a geometria editável, mas por referência. Quando a geometria precisa ser alterada, chamo UpdateTata (...) com um geometria apropriado, que faz o que faz. Vazamentos de memória.

  • Recrie o gráfico de cena inteiro. Quando a geometria precisar ser alterada, separo todo o gráfico da cena, o recrio do zero usando a geometria atualizada e anexo o novo gráfico de cena. Vazamentos de memória.

Não posso deixar de sentir que há algo básico no gerenciamento de memória Java 3D que estou perdendo e isso é comum a todas as minhas tentativas.

A velocidade de mudar a geometria não é um problema, pois é uma ocorrência rara. O problema da memória, no entanto, é sério.

Foi útil?

Solução

Geralmente, é enganoso usar ferramentas que monitoram a memória no nível do sistema operacional para deduzir vazamentos de memória em uma máquina virtual Java. A JVM tem suas próprias idéias sobre quando é eficiente reivindicar e recuperar a memória.

Se você pode explicar como está observando o vazamento de memória e por que é um problema sério, pode ser mais fácil responder à sua pergunta.

  • Como você está medindo o uso da memória?
  • Se você forçar uma coleta de lixo e emitir o uso da memória, você ainda vê o vazamento?
  • O problema da memória causa um java.lang.outOfMemoryError?

Você também pode estar interessado nesta pergunta: https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools

Outras dicas

Anexe ao seu programa com o VisualVM (disponível como binário JVisualVM no JDK) e use o Profiler para ter uma idéia para onde vai sua memória.

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