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.
Uma vez que o objeto fique sem referências, a memória dele é liberada. A liberação pode não ser instantânea, mas ocorre bem rapidamente.
alexborges
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
Luiz_Gustavo
Olá!
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.
Abraços!!
nbluis
Na verdade isso que você disse, de a memória não ser desalocada pelo java para o SO eu ja tinha ouvido falar.
Mas não consegui achar referências para poder ter certeza. (também não procurei tanto assim)
Mas uma coisa que você pode fazer, é talvez um tuning na GC, customizando o algoritimo de coleta para a sua necessidade.
Obrigado pessoal, vou argumentar com meu chefe e dedicar um tempo fazendo tunning
victorwss
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.