Eu tenho uma aplicacao GIS em Swing que carrega muitos tipos diferentes de mapas e eu sempre acabo utilizando uns 300 MB de memoria do sistema operacional.
Eu queria otimizar a aplicacao para que o GC pudesse liberar uma parte dessa memoria na medida que o usuario desabilitasse ou apagasse alguns mapas utilizados pela aplicacao. Entao, meu chefe disse que isso nao iria funcionar, por que uma vez que a JVM adquire a memoria do SO (windows), ela nao libera nunca mais, sendo que o GC somente libera memoria dentro da JVM para que novos objectos possam ser criados
sem utilizar mais memoria do SO.
Achei isso muito estranho e achei que meu chefe viajou, para mim a funcao do GC sempre foi liberar memoria do SO para manter a aplicacao sob controle.
vc esta fazendo essa verificanão pelo taskmgr do windows, se for isso, mesmo aplicação liberando grande parte da memoria
o taskmgr não vai mostrar que o processo liberou aquela quantia de memoria, só vai fazer isso quando outro processo solicitar aquela memoria
Existem algumas aplicações para gerenciamento de memória da JVM, mas existe uma aplicação de exemplo, que vem na instalação do JDK, que mostra a utilização de memória da JVM.
Não sei se você já conhecia, ou se te ajuda em alguma coisa em sua avaliação, mas :
[JAVA_HOME]\demo\management\MemoryMonitor
Legal que ela mostra a quantidade de memória em cada área do heap.
Já tive esse problema de uma aplicação em java que consome muita memória fica lenta e disparando várias falhas de páginas no SO. Porém, mesmo liberando quase tudo para o GC depois, ela continuou lenta por causa de falhas de páginas no SO!
Vai ver que isso é algum tipo de estratégia de implementação (ou bug) da JVM.
Exemplo disso: Tentem carregar com o netbeans 6, uns 100 arquivos de código-fonte de tamanho razoavelmente grande. Comece a editá-los aleatoriamente por um tempo e depois feche todos. Mesmo se depois de fechar todos, você só editar um hello world, o Netbeans vai ser praticamente inutilizável de tão lerdo que vai ficar.