Liberar memória

11 respostas
L

Bom dia pessoal

Tenho um problemão aqui, cada janela q abro ocupa memória e não desocupa quando fecho. mesmo usando super.dispose(). Alguém já teve esse problema ? Alguém tem idéia de uma solução ?

11 Respostas

fantomas

Vc tem que dixa-las sem referencia para que o garbage collector (pesquise sobre isso) possa retira-las da memória.

Ex: ClientView clientView = new ClientView(); clientView = null;

flws

L

Sim, já estou fazendo isso, mas ainda tenho o mesmo problema.

if (m_APanel != null)
		m_APanel.dispose();
	m_APanel = null;
	this.removeAll();
	super.dispose();
fantomas

Então…o dispose se não me engano faz com que os recursos internos do objeto fiquem disponíveis para o gc, ainda assim atribuiria null para o objeto “pai” assim: m_APanel = null;

Outro detalhe é que o gc não retira os objetos imediatamente da memória.

Mas que situação é essa sua que a memória ficou reduzida a ponto de ter que destruir as janelas por completo? Na maioria das vezes é o contrario; mante-las ajuda na performance da aplicação na parte visual.

flws

L

Pois é, o problema é bem esse, performance.

A medida que o sistema vai sendo utilizado, durante o dia, vai ficando cada vez mais lento.

Notei que a memória utilizada do arquivo de paginação do windows, aumenta quando abro a janela e não diminui quando fecho a mesma, somente quando fecho o sistema todo.

Notei também que se eu abro (apenas abro) outro projeto dentro do eclipse e depois fecho esse projeto, acontece o mesmo com o arquivo de paginação. Estou achando que meu problema é com Rwindows mesmo.

Meu sistema está tão grande que para não ter erro de OUT of memory, eu preciso incluir como argumento na Vm a expressão -Xms32m -Xmx256m, não sei se isso tem alguma influência na paginação.

Enfim, não sei o que fazer.

PadrE

Opa… eae povo !

Estou com um problema parecido! E ta dificil de resolver…

Tenho um sistema principal que abre uma série de subframes… e a cada nova frame um alocação de memória, quando fecho a frame, seto null na variavel para avisar o gb… Mesmo depois de um tempo, a memória continua alocada… então chamei o velho System.gc() após o null… e nada…

Sei que a execução do gb não pode programada ou mesmo que executada não podemos garantir que isso seja feito com eficiêcia pois depende da JVM (no meu caso a 1.4) e tb do sistema operacional (no meu Windows XP Professional SP2)…

Vou fazer uns testes aki e se descobrir algo aviso vcs…

Fui !

PadrE

Opa…

Descobri algo aki…

Eh o seguinte… fiz alguns testes… crei um JFrame e coloquei ele para chamar outros subframes…

A cada novo frame (com uma JTable ja populada) ocorria uma alocação de ± 4Mb.

Bom… comecei com 768, só de abrir a aplicação pulou para 794, e fui abrindo subframes até alocar ± 812.

Ai comecei a fechar os subframe, chamando o dispose nativo de cada um… como não guardei a referência em lugar algum elas ficavam a merce do GC… ^^

Após fechar todas e ficar só com a primeira a alocação continuou a mesma… ± 814. Logo em seguida executei o GC… e nada… os mesmos 814.

Fui tomar um café, e na volta continuava com os 814… então executei o GC novamente e… caiu para os mesmos 794 iniciais…

Agora… preciso ver se isso ocorreria uatomaticamente após uns 3 cafézinhos… ^^

Ou se é mesmo necessário uma intervenção na programação… ^^

PadrE

Povo… uma pergunta…

Todos sabem que a execução do GB eh feita pela JVM do SO, ou seja, dependente muito de como ela foi implementada para aquele o SO usado…

Com o jre1.4, a a locação de memória fica cada vez maior… e mesmo após um grande período de uso do sitema o GB não reduz a alocação de memória…

Alguem sabe se nas JVM’s isso não ocorre mais ??? E se isso eh mesmo algum problema da jre 1.4 ou eu que estou pecando em algum lugar no código ?!?

Vlw

Marcelo_FS

Os Garbage Collectors das JVMs atuais estão muito avançados. Se você tem problemas de OutOfMemory, é mais provável que esteja com algum leak no seu código… você até pode dar uma olhada nos vários tipos de GCs disponíveis e testar com eles, mas sugiro que pegue direto um profiler e dê uma olhada no que está ficando na memória.

PadrE

O dificil vai ser arrumar tempo para instalar as VM testar em cada uma delas… =/

Bom… vou ver se arrumo um programinha que mostre o conteudo da memória (algum profiler) como vc citou…

Assim posso ter certeza dos objetos que estão ficando por mais tempo alocados…

Se vcs souberem algum para indicar… ^^

Vlw !!

Marcelo_FS

VisualVM

PadrE

MarceloS,

Muito bom esse software hein… vi que ele vem nativo no java 1.6

Bacana… ainda to vendo como funciona… mas acredito que ele irá me ajudar a identificar o problema de memória… ^^

Vlw !

Criado 13 de novembro de 2008
Ultima resposta 23 de dez. de 2008
Respostas 11
Participantes 4