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é!
T
thingol
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”.
G
giovanni_stiwes
maquiavelbona:
1- A discrepância é grande? Senão o que está mostrando é a memória disponível dentro do alocado do processo java.exe.
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?
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.