Gerenciamento de Memoria

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é!