Garbage Collector - problemas

Pessoal, bom dia,

Estou passando por um problema com o Garbage Collector. Ao entrar em uma tela que possui campos texto, ao digitar um texto e sair da tela, quando clico no Run GC conforme imagem em anexo, os objetos desta tela não são coletados, permanecendo referenciados na lista com os mesmos bytes de consumo. Porém, se eu entro na tela e saio sem digitar nenhum texto, os objetos da tela são coletados normalmente!

Alguém já passou por este problema ? Possuímos muitas telas e não podemos deixar os objetos assim na memória, depois de alguns minutos de uso, está gerando outofmemoryerror

grato


Como está sua estrutura de classes?

Beleza cara?

obrigado por responder… não vou postar toda a estrutura pois é desnecessário… o problema está no trecho abaixo

a classe possui um textfield. Se eu digito algo no textfield, a classe continua para sempre na memória, mesmo saindo da tela… se não uso o textfield, a classe é coletada pelo Garbage Collector assim que saio da tela… já tentei setar o textfield para null no evento de sair da tela, mas mesmo assim não funcionou


public abstract class FrmEditarTrocaMercadoriasBasic extends Form {

       protected TextField txtNumeroNota;

      public FrmEditarTrocaMercadoriasBasic() {
		super("Troca de Mercadorias");		
		initialize();	
      }

      private void initialize() {
		// componentes
		addComponent("Nota Fiscal:",getTxtNumeroNota());
      }

      protected final TextField getTxtNumeroNota() {
		if (txtNumeroNota == null) {
			txtNumeroNota = new TextField();
			txtNumeroNota.setMaxLength(14);
			txtNumeroNota.setWidth(110);
			txtNumeroNota.setType(InputType.NUMBER);
		}
		return txtNumeroNota;
	}
}

apenas para constar, esse componente é de um framework de terceiros, onde não possuímos o código… o problema pode ser no framework, mas entramos em contato com o fornecedor e o mesmo alega que não.

Boa Tarde,

Não há como ter controle sobre o Garbage Collector, sendo que ao realizar um Run GC na verdade ocorre apenas uma solicitação ao VM, mas a limpeza será realizada apenas quando o algoritmo da Java VM determinar.
Quando se trabalha com String há certos elementos a considerar, como por exemplo o ‘pool de Strings’ gerado por Objetos da classe String, ao contrário do que ocorre com StringBuilder e StringBuffer. Não sei se há esse tipo de preocupação e se você tem acesso a isso no código, mas pode estar relacionado ao seu problema.

rdsilio, ao chamar o Run GC, ele não vai obrigatoriamente coletar o lixo naquele instante, porém, mais cedo ou mais tarde recolherá caso o objeto seja um candidato. Já deixei a aplicação rodando por alguns minutos tentando sucessivas vezes e os objetos referente a esta tela não foram coletados…

sobre o pool de Strings, se eu seto null para o objeto assim que saio da tela, as Strings continuam no pool, porém, como o objeto perde a referência para a mesma, ele seria coletado não?

grato pela resposta

[quote=CarlosEduardoDantas]rdsilio, ao chamar o Run GC, ele não vai obrigatoriamente coletar o lixo naquele instante, porém, mais cedo ou mais tarde recolherá caso o objeto seja um candidato. Já deixei a aplicação rodando por alguns minutos tentando sucessivas vezes e os objetos referente a esta tela não foram coletados…

sobre o pool de Strings, se eu seto null para o objeto assim que saio da tela, as Strings continuam no pool, porém, como o objeto perde a referência para a mesma, ele seria coletado não?

grato pela resposta[/quote]

Sobre o pool de String, ao setar null, embora a variável perca a referência, o objeto continua sendo mantido no pool para ser reaproveitado por outros objetos com o mesmo texto, e isso pode ser um problema dependendo da aplicação e do volume de modificações no conteúdo de uma variável do tipo String, pois a cada mudança no valor, um novo elemento é adicionado ao pool e a duração dele é gerenciada pela VM.

[quote=rdsilio][quote=CarlosEduardoDantas]rdsilio, ao chamar o Run GC, ele não vai obrigatoriamente coletar o lixo naquele instante, porém, mais cedo ou mais tarde recolherá caso o objeto seja um candidato. Já deixei a aplicação rodando por alguns minutos tentando sucessivas vezes e os objetos referente a esta tela não foram coletados…

sobre o pool de Strings, se eu seto null para o objeto assim que saio da tela, as Strings continuam no pool, porém, como o objeto perde a referência para a mesma, ele seria coletado não?

grato pela resposta[/quote]

Sobre o pool de String, ao setar null, embora a variável perca a referência, o objeto continua sendo mantido no pool para ser reaproveitado por outros objetos com o mesmo texto, e isso pode ser um problema dependendo da aplicação e do volume de modificações no conteúdo de uma variável do tipo String, pois a cada mudança no valor, um novo elemento é adicionado ao pool e a duração dele é gerenciada pela VM.[/quote]

Sim, a String que eu usei continua no pool, por exemplo, no código “Troca de Mercadoria” continuaria no pool, porém a instância da classe FrmEditarTrocaMercadoriasBasic (na verdade a instância da classe filha, já que essa é abstrata) deveria ser coletada.

Obrigado pela ajuda, mas o meu problema não é com as Strings, é com as instâncias das classes referente às telas.