Estou usando um monitor de memoria na minha aplicação e vejo os seguintes “problemas”:
1 - O total de memoria mostrado pelo java é diferente da quantidade de memoria mostrada pelo processo java.exe.
2 - O Garbage coletor só está coletando, quando a memoria livre está quase no fim, e em algumas vezes ele da estouro de memoria.
3 - O tópico 2 (acima) só acontece se eu não chamar o System.gc() manualmente.
Se alguem tiver explicações eu agradeço.
1- A discrepância é grande? Senão o que está mostrando é a memória disponível dentro do alocado do processo java.exe.
2 e 3- O garbage collector não tem obrigação de rodar em nenhum momento, ele não tem tempo para rodar e você não pode exigir que ele rode. Quando chamas System.gc(), você sugere que ele execute, pode executar ou não. E ele pode estar colentando os objetos só no fim da memória porque pode ser que os objetos não foram marcados ainda para a coleta, então o GC nem toca neles.
Até!
Pode ser que você tenha de passar alguma opção para alterar o algoritmo usado pelo Garbage Collector.
Isso já é um pouco complicado e depende da versão do seu JDK, assim como o fornecedor (por exemplo, as opções para a JVM da Sun são diferentes das opções da IBM e da BEA).
Outra coisa: será que não estão sendo usados muitos objetos que implementam o método “finalize”? Se isso estiver ocorrendo, muitos deles só são limpos a cada 2 vezes que o garbage collector efetua uma “full garbage collection”.
[quote=maquiavelbona]1- A discrepância é grande? Senão o que está mostrando é a memória disponível dentro do alocado do processo java.exe.
[/quote]
A discrepancia é variavel, quanto mais memoria alocada, maior a discrepancia.
Estou Usando Win XP e Sun Java 6.
Já que eu não posso controlar o GC como evitar o eutouro de memoria?
Podes começar por aqui:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
http://java.sun.com/javase/technologies/hotspot/index.jsp
Se estiver criando muitos objetos dentro de um loop, procure reaproveitá-los ou liberá-los quanto antes, utilize tipos menos complexos de dados, quando a thread estiver para estourar a memória, suspendê-la e deixar com o que garbage collector limpe o que ainda ficou. O melhor para tudo isso é um profiler, tem vários por aí com integração com as IDEs.
Até!