Vazamento de memória Java 3D
-
24-09-2019 - |
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.
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.