Olá a todos…
Bom pessoal, percebi que minha aplicação estava ficando lerda após varios minutos de uso sem interrupção, entao eu fiz uma Thread pra monitorar e exibir na tela inicial quanto de memoria eu tinha alocado, quanto estava sendo usado e quanto estava livre, meu programa começa com ± 17764 Kb alocado, e usando ± 13500 à 14500 Kb na memoria, e percebi que cada vez que eu abro uma tela, e fecho, o espaço na memória que foi utilizado por ela nao é liberado. entao o que acontecia era que eu ia usando o programa até ele usar os 65088 Kb que é o total de memória que o meu programa pode usar, e entao a seguinte excessao era lançada:
[color=red]Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space[/color]
Blz, até entao eu nao me preocupava com objetos, pq tinha o tal do garbage collector, só que nao tava liberando a memória, entao fui pesquisar, e encontrei nesse link algo bem simples mas que achei bastante util, http://imasters.uol.com.br/artigo/3148/ajudando_o_garbage_do_java, dai fiz um teste, sobreescrevi o metodo finalize(), atribui null a todos os objetos da minha tela, e ainda coloquei um System.out.println(“entrou no finalize”); só pra ter certeza de que seria executado, e o metodo finalize é executado sim, inclusive depois da terceira vez q eu abro a tela, ele é executado sempre que abro e fecho uma tela.
Mas mesmo fazendo isso, o espaço usado na memoria ainda nao esta sendo liberado. O menu do meu sistema é dinamico e funciona com reflexao, entao eu também criei uma Lista pra armazenar as telas que sao abertas, e quando eu fecho essa tela, eu atribuo null no objeto referente a ela, buscando a mesma nessa lista, e depois removo ela da lista, e chamo System.gc(); para pedir a maquina virtual que rode o garbage collector.
Alguem tem alguma ideia se esta faltando alguma coisa ??? Eu to fazendo algo de errado ???
Sei lah, eu penso que quando eu abro uma tela, td bem ela vai ocupar certo espaço na memoria, mas quando eu fecho ela, esse espaço deveria ser liberado, e isso nao acontece, agora o porque eu nao sei…
vou colocar um codigozinho do que eu fiz na tela de vendas:
aqui eu sobreescrevi o metodo finalize()
[code]protected void finalize() {
try {
//todos os objetos declarados da tela recebem null, inclusive os JLabel, JButton…
System.out.println("-------------- entrou no finalize --------------");
} catch (Throwable ex) {
ex.printStackTrace();
}
}[/code]
aqui no evendo windowClosed do form eu atribuo null na tela e removo ela daquela lista que mencionei (listaObjetos está declarado global na classe)
listaObjetos.removerObjeto(getClass().getName());
e aqui é o codigo que uso para criar a tela, e adicionar ela na lista, (é só a parte que interessa), onde “nome” é um parametro do nome da classe
Class classe = Class.forName(nome);
Object obj = classe.newInstance();
listaObjetos.addObjeto(nome, obj);
e aqui é o método removerObjeto
public void removerObjeto(String nome) {
for (int i = 0; i < lNomes.size(); i++) {
String s = lNomes.get(i);
if (s.equals(lNomes.get(i))) {
lObjetos.set(i, null);
lNomes.remove(i);
lObjetos.remove(i);
System.gc();
break;
}
}
}
Desde já grato !!! t+