Como forçar o uso do Garbage Collector?

9 respostas
M

Olá,

eu tentei usado os recursos System.gc() e Runtime.getRuntime().gc() (que são a mesma coisa resumidamente falando) para tentar forçar a coleta de lixo.

Estou trabalhando com processamento de imagens com tamanho acima de 3000 pixels e preciso fazer a coleta de objetos em desuso para que a aplicação não trave por falta de memória.

Fiquei sabendo que os métodos citados acima (em negrito) funcionam apenas para agendar uma coleta de lixo. Esta informação é mesmo verdadeira? Sendo verdadeira, há algum procedimento capaz de realizar esta tarefa?

Grato.

9 Respostas

V

Voce nao tem como forçar a coleta de lixo, mesmo utilizando o gc() nao é garantido que a coleta seja executada.
O que vc pode fazer para ajudar é setar como null todos os objetos que nao serao mais utilizados, com isso vc qualifica o objeto a ser coletado.

T

Você pode até tentar usar periodicamente System.gc() (Runtime.getRuntime().gc() é exatamente a mesma coisa), mas é desejável ver se você não tem algum método que pode efetuar o “dispose” dessa imagem, uma vez processada.

Se você estiver usando alguma biblioteca que usa código nativo elas costumam normalmente ter um método com nome “dispose” ou coisa parecida que limpa essa imagem da memória.

F

MRapha, é uma aplicação desktop? Você utilizou alguma ferramente de profiler para confirmar este problema?

M

É uma aplicação Desktop que teve o problema confirmado por não passar do 8° processo por ficar sem memória para uso. Estou no desenvolvimento da nova versão corrigindo esse problema.

F

mrapha:
É uma aplicação Desktop que teve o problema confirmado por não passar do 8° processo por ficar sem memória para uso. Estou no desenvolvimento da nova versão corrigindo esse problema.

Por um acaso você está exibindo essas imagens em um JTable?

M

Em 4 Jlists na antiga aplicação. Esta parte de trabalhar as imagens em coletividade ainda serão refeitas. Estou no desenvolvimento da API de manipulação da imagem. Esta já recebeu o Runtime.getRuntime().gc() nos métodos de redimensionamento, salvar e manipulação de cores e luminosidade.

Eu preciso de um modo em que mate esta sujeira de memória ao início ou ao término de cada processo deste.

fabiozoroastro:
mrapha:
É uma aplicação Desktop que teve o problema confirmado por não passar do 8° processo por ficar sem memória para uso. Estou no desenvolvimento da nova versão corrigindo esse problema.

Por um acaso você está exibindo essas imagens em um JTable?

F

mrapha:
Em 4 Jlists na antiga aplicação. Esta parte de trabalhar as imagens em coletividade ainda serão refeitas. Estou no desenvolvimento da API de manipulação da imagem. Esta já recebeu o Runtime.getRuntime().gc() nos métodos de redimensionamento, salvar e manipulação de cores e luminosidade.

Eu preciso de um modo em que mate esta sujeira de memória ao início ou ao término de cada processo deste.

fabiozoroastro:
mrapha:
É uma aplicação Desktop que teve o problema confirmado por não passar do 8° processo por ficar sem memória para uso. Estou no desenvolvimento da nova versão corrigindo esse problema.

Por um acaso você está exibindo essas imagens em um JTable?


Entendi.
Eu te perguntei isso pois uma vez eu tive um problema com exibição de imagens em uma JTable. Estávamos achando que o problema era o consumo de memória, mas no final das contas o problema era com o javax.swing.JTable. Quando eu aumentava propriedade height das linhas, ocorria o problema.

Acho que vale a pena você testar se realmente as imagens é que estão causando o problema ISOLADAMENTE para depois garantir que o problema é com elas.

Até mais.

M

Mas isso já foi feito pois este problema era pior até eu setar null nas imagens que não eram mais usadas.

fabiozoroastro:
mrapha:
Em 4 Jlists na antiga aplicação. Esta parte de trabalhar as imagens em coletividade ainda serão refeitas. Estou no desenvolvimento da API de manipulação da imagem. Esta já recebeu o Runtime.getRuntime().gc() nos métodos de redimensionamento, salvar e manipulação de cores e luminosidade.

Eu preciso de um modo em que mate esta sujeira de memória ao início ou ao término de cada processo deste.

fabiozoroastro:
mrapha:
É uma aplicação Desktop que teve o problema confirmado por não passar do 8° processo por ficar sem memória para uso. Estou no desenvolvimento da nova versão corrigindo esse problema.

Por um acaso você está exibindo essas imagens em um JTable?


Entendi.
Eu te perguntei isso pois uma vez eu tive um problema com exibição de imagens em uma JTable. Estávamos achando que o problema era o consumo de memória, mas no final das contas o problema era com o javax.swing.JTable. Quando eu aumentava propriedade height das linhas, ocorria o problema.

Acho que vale a pena você testar se realmente as imagens é que estão causando o problema ISOLADAMENTE para depois garantir que o problema é com elas.

Até mais.

V

Se a tua aplicação dá OutOfMemoryError, não vai ser o System.gc() que vai te ajudar.

Quando a JVM vai alocar memória, e não tem memória suficiente, ela roda o coletor de lixo, travando quaisquer Threads que tentem alocar qualquer memória (o programa dá aquela engasgada). Se após a coleta de lixo (possivemente uma coleta completa “full garbage collection”), ela conseguir memória suficiente, o programa continua. Se não conseguir, ela lança OutOfMemoryError.

Ou seja, o System.gc() só serve para dizer: “ei JVM, agora é uma hora boa para fazer aquela coleta de lixo”. Na prática, isso só serve para otimizar o desempenho, e não para economizar memória.

O que você pode tentar fazer é reduzir o número e o tamanho dos objetos em memória. Você pode optá-los por salvá-los no disco e voltar eles para a memória quando forem necessários. Outra ideia é usar as classes WeakReference<T> e/ou WeakHashMap<K, V> para criar algo semelhante a memórias cache.

Criado 7 de abril de 2009
Ultima resposta 7 de abr. de 2009
Respostas 9
Participantes 5