Matar Instância na força bruta

37 respostas
TiagoFoil

Bom dia,

Eu estava precisando matar a instância de um objeto na força bruta. Sem, em hipótese alguma, depender do Garbage Colector. Pois quando passo null pra ele e chamo System.gc(); Ele continua lá. Li em algum lugar q o GC nem sempre irá finalizar uma instância q esteja com null só pq foi chamado.
Entao, queria saber se existe outra forma de finalizar totalmente um objeto e limpá-lo da memória em tempo de execussão. Existe???

Desde agradeço,

Tiago Duarte

37 Respostas

diego2005

Acho que não é possível destruir um objeto explicitamente, só o GC pode fazer isso. E você NÃO pode forçar a execução do GC, você pode apenas fazer uma solicitação, o que não quer dizer que ele vai atendê-lo.

seduardo

Pela especificação do java, por meio natural não tem. Uma prática utilizada por vários programadores é criar um método que libere seus recursos, assim como o close(), destroy() ou release().
Assim você antes de passar null para o objeto, você chama um método para liberação de recursos. Como por exemplo:

try { .... } finally { obj.release(); obj = null; }

louds

Chama o Chuck Norris que ele te resolve isso!

Luca

Olá

Quando você coloca null na referência o objeto continua em uso ou apenas na memória?

Seu objeto contém outros objetos? As referências deles também foram anuladas?

Dê uma estudada no funcionamento do GC que sempre é útil para todos nós.

[]s
Luca

TiagoFoil

lol
Só o chuck norris pode resolver essa questão mesmo! hahaah! quando o objeto for de um tipo q nao tenha métodos para liberar recurso, q é o meu caso.
Bom, fiquei sabendo q o Chuck Norris nao usa Primary Key no banco dele, pois os registros não se atrevem a duplicarem. Rofl! Entao, talvez ele possa dar um hound house kick no meu objeto pra remover a instancia…
Pior q vou ficar dependendo do CN(Chuck Norris) ao invés do GC (Garbage Colector) e o CN é da mesma família do GC. Eles nao gostam de receber ordens. ^^

TiagoFoil

Luca:
Olá

Quando você coloca null na referência o objeto continua em uso ou apenas na memória?

Seu objeto contém outros objetos? As referências deles também foram anuladas?

Dê uma estudada no funcionamento do GC que sempre é útil para todos nós.

[]s
Luca

Ele continua instanciado, pois quando dou um getInstance ele retorna a mesma instancia ao inves de criar uma nova. Este objeto possui outros objetos sim, as referencias deles tem q ser anuladas uma a uma?

Vou estudar mais sobre o GC ^^

Brigadao

diego2005

Um exemplo:

import java.swing.JButton;

public class GC
{
    public static void main(String[] args)
    {
         JButton bt1 = new JButton("Botão 1");
         JButton bt2 = bt1;
   
         bt1 = null; // não torna o objeto elegível para o GC, pois bt2 ainda o referencia
         bt2 = null; // agora o objeto é elegível para o GC
    }
}
Mauricio_Linhares

TiagoFoil:

Ele continua instanciado, pois quando dou um getInstance ele retorna a mesma instancia ao inves de criar uma nova. Este objeto possui outros objetos sim, as referencias deles tem q ser anuladas uma a uma?

Vou estudar mais sobre o GC ^^

Brigadao

“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?

Que tal você explicar melhor o seu problema?

fmeyer

Maurício Linhares:

“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?
Que tal você explicar melhor o seu problema?

falando em singletons eles foram definidos como uma doenca ja … Singleontiti :twisted:

http://www.theserverside.com/blogs/thread.tss?thread_id=42116&asrc=EM_NLN_559044&uid=2623147

TiagoFoil

Maurício Linhares:

“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?

Que tal você explicar melhor o seu problema?

É um singleton sim.

Vou tentar ser mais claro.
Eu tenho uma classe q possui diversas funcionalidades, dentre estas uma q me da um enumeration com elementos q será usados por mim para montar uma lista. Beleza, eu instancio um objeto dessa classe, pego as informaçoes q eu quero, monto minha lista e passo essa lista pra camada de visão. Agora q ja tenho o q eu queria (a lista) eu quero desinstaciar essa classe, nesse exato momento q ja tenho a lista. Por que disso?
Porque eu preciso depois pegar uma nova lista atualizada. E, enquanto esse objeto estiver instanciado, ele nao consegue enxergar novos elementos. Assim sendo, eu tenho q fechar toda aplicaçao (neste momento o objeto finalmente morre) e quando eu abro a aplicaçao denovo a lista pode ser atualizada.
Entao, pra nao ter essa chatisse de ficar fechando e abrindo o programa, eu queria “simular” seu fechamento. Apenas no contexto desse objeto. Assim q eu aprender a colocar código aki pra download eu coloco o código dele… ^^

louds

Não use uma variavel estática e resolve

Luca

Olá

Basta fazer copy&paste entre as tags Code.

Seu caso agora ficou um pouco mais claro:

  1. Sua lista não será recolhida pelo lixeiro antes de ter todos seus membros anulados. E mesmo assim não será recolhida imediatamente.

  2. Seu código parece com o que se usa para mostrar resultado de consulta à base de dados na tela mas feito de um modo muito estranho. Acho que você poderia aproveitar a ocasião para revê-lo.

  3. Singletons são úteis e há casos em que são usados. Porém é preciso reconhecer as poucas ocasiões em que eles podem ser usados porque muitas vezes eles atrapalham e muito. Estude bem Singletons e aprenda a reconhecer suas desvantagens para evitar que no futuro seu sistema necessite ser modificado. Muitas vezes há um meio mais flexível de resolver o problema sem usar Singleton.

[]s
Luca

cv1

Voce tem um SINGLETON no seu codigo, e ta se preocupando com coisas mundanas como vazamento de memoria?

Arranque o singleton de la, depois a gente conversa, ok? :wink:

TiagoFoil

cv:
Voce tem um SINGLETON no seu codigo, e ta se preocupando com coisas mundanas como vazamento de memoria?

Arranque o singleton de la, depois a gente conversa, ok? ;)

Meu problema nao é vazamento de memoria.
Meu problema é o q “nao acontece” quando esse cara nao limpa sua instancia. Este é o problema.

TiagoFoil

Luca:

Basta fazer copy&paste entre as tags Code.
Luca

Acontece q o código é muito grande e me xingariam falando q estou desrespeitando a barra de rolagem vertical. Sendo assim, eu queria colocar aquele linkzinho pra download do código.

vlw ^^

cv1

Voltando ao assunto, pq vc precisa de um singleton?

TiagoFoil

Na verdade eu nao preciso de um Singleton. Esse singleton q to usando é da api do mozilla. Pacote org.mozilla.jss. Pra ser mais preciso é a classe Cryptomanager. É dela q eu falo to tempo todo. E ela é um singleton.

renatosilva

TiagoFoil:
Maurício Linhares:

“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?

Que tal você explicar melhor o seu problema?

É um singleton sim.

Vou tentar ser mais claro.
Eu tenho uma classe q possui diversas funcionalidades, dentre estas uma q me da um enumeration com elementos q será usados por mim para montar uma lista. Beleza, eu instancio um objeto dessa classe, pego as informaçoes q eu quero, monto minha lista e passo essa lista pra camada de visão. Agora q ja tenho o q eu queria (a lista) eu quero desinstaciar essa classe, nesse exato momento q ja tenho a lista. Por que disso?
Porque eu preciso depois pegar uma nova lista atualizada. E, enquanto esse objeto estiver instanciado, ele nao consegue enxergar novos elementos. Assim sendo, eu tenho q fechar toda aplicaçao (neste momento o objeto finalmente morre) e quando eu abro a aplicaçao denovo a lista pode ser atualizada.
Entao, pra nao ter essa chatisse de ficar fechando e abrindo o programa, eu queria “simular” seu fechamento. Apenas no contexto desse objeto. Assim q eu aprender a colocar código aki pra download eu coloco o código dele… ^^

Então essa classe que você quer re-instanciar é o tal Singleton da Mozilla? Não existe um método pra atualizar a lista?

renatosilva

Acho que se você pudesse matar o obj à força estaria furando um conceito fundamental do Java, que é cuidar da alocação de memória pra você…

Agora eu não entendi o seguinte: Quando você dá um novo getInstance() e ele pega a tal instância teoricamente já sem referências, ou seja, elegível para GC, como esse método acha ela??? Isso é possível, a JVM faz isso??? Estranho…

Meio bagaça isso aqui, mas uma idéia é você dar o null no objeto, chamar o gc() e na hora de obter uma nova instância do dito cujo, você lança uma thread com um loop que verifica se o retorno do getInstance é a instância velha (como?), só saido do loop quando não for mais. Ou seja, você fica esperando o GC comer o objeto, sabe-se lá quando…hummm acho que não é mto legal não hehehehe…

grprado

Só uma pergunta, você está fazendo algo parecido com isto?

Cryptomanager crypto = Cryptomanager.getInstance();
crypto.fazerMuitasCoisas();
//blah blah
//e finalmente, tenta liberar a instance
crypto = null;
TiagoFoil

Só uma pergunta, você está fazendo algo parecido com isto?

Cryptomanager crypto = Cryptomanager.getInstance(); crypto.fazerMuitasCoisas(); //blah blah //e finalmente, tenta liberar a instance crypto = null;

Exatamente isso… e no final, depois do “crypto = null” eu chamo o GC com “System.gc();”

TiagoFoil

renato3110:

Então essa classe que você quer re-instanciar é o tal Singleton da Mozilla? Não existe um método pra atualizar a lista?

Sim, é ela. Existe um método sim o “Cryptomanager.reloadTokens()”. Mas ele nao funciona. Não me pergunte pq.

renatosilva

Vê o javadoc dele, e o código-fonte…

grprado

É por isso que não funciona. Não basta você liberar a sua referência com = null para que o singleton libere a dele.

Ou a classe do mozilla te dá um método para fazer isso explicitamente, coisa que eu duvido muito que exista senão há uma grande chance de furar o conceito do singleton, ou, o mais provavel, você nunca vai conseguir isso.

Só justificando a afirmação acima:

  • o conceito de singleton é que você somente tem uma instancia de algo no sistema e todas as variaveis que referenciam essa instancia sempre apontam para o mesmo objeto.

  • Essa classe deve fornecer um metodo .getInstance() que cria uma instancia nova e unica (caso precise), devolvendo-a. Até aqui nada diferente de um Singleton.

  • Agora imagine que essa classe possua um outro método chamado destroyInstance() que faz com que o singleton altere a variavel static para null.

Compile todas essas informações e pense no seguinte código:

PseudoSingleton s1 = PseudoSingleton.getInstance(); // retorna a instancia #1
PseudoSingleton s2 = PseudoSingleton.getInstance(); // retorna também a instancia #1

//Vamos agora "limpar" o singleton
PseudoSingleton.destroyInstance();
//E vamos criar um outro objeto com uma instancia do singleton
PseudoSingleton s3 = PseudoSingleton.getInstance(); // retorna a instancia #2

if (s1 != s3) {
  //ops! não é um singleton de verdade!
}

Entendeu?

De qualquer maneira, leia o código fonte dessa classe.
Provavelmente você se deparará com uma variavel static que uma vez inicializada não é mais liberada.

Aproveite também para estudar um pouco o pattern singleton, ou seria anti-pattern?

TiagoFoil

Pior, só fui perceber que era um singleton depois.
Mals aí pela insistência pessoal.
Bom, mas eu tbm tinha a dúvida de como limpar uma instancia na hora q a gente quizesse.
Esclareceu alguns conseitos q eu ainda nao tinha absorvido.
Obrigado a todos! ^^

renatosilva

Mas vc conseguiu resolver?

TiagoFoil

Não, não consegui resolver. Estou tentando aprender a usar Threads pra resolver, pois eu nao gostaria de alterar o código desse Singleton. E, mesmo matando sua instancia, outra instancia em código nativo continuaria a me atrapalhar. Entao queria colocar esta parte do programa numa Thread. Poderia me dar uma forcinha nisso?
Alguém já me deu uma prévia de como ficaria, mas nao to conseguindo achar o post do amigo, deve ter sido em outro topico meu sobre o assunto. Vou procurar mais.
Se puder me ajudar sobre essas Threads seria grato.

vlw^^

renatosilva

Em cód. nativo? Doido…

O que vc está falando das threads, é de fazer um loop até o GC rodar?

TiagoFoil

Em codigo nativo sim. Quis dizer em linguagem C.

Aqui, era isso mesmo de fazer um loop até o GC rodar, foi vc q sugeriu isso??

renatosilva

Sim, fui eu.

Mas eu tô achando estranho o seguinte: quando o Singleton é instanciado existe um método (mesmo uma ponte pra algo nativo) que efetivamente carrega a tal lista dentro do Singleton. Você não tem como chamar esse método outra vez? Ou será que vai “ferrar” o Singleton?

Sabe que eu tô achando, que essa classe não deveria ser um Singleton, se eu fosse você enviava uma mensagem pros desenvolvedores contando teu caso, isso não devia ser um Singleton…

TiagoFoil

Vc deletou o seu post sobre as threads? Num tô achando nem por reza braba! ja tô quase ficando louco aqui achando q eu inventei isso da minha cabeça! mas eu tenho certeza q eu vi isso! Entao como foi sumir assim?!

Posta de novo por favor vai?! ^^

renatosilva

Ué, o que eu tinha falado era isso aqui:

renato3110:
Acho que se você pudesse matar o obj à força estaria furando um conceito fundamental do Java, que é cuidar da alocação de memória pra você…

Agora eu não entendi o seguinte: Quando você dá um novo getInstance() e ele pega a tal instância teoricamente já sem referências, ou seja, elegível para GC, como esse método acha ela??? Isso é possível, a JVM faz isso??? Estranho…

Meio bagaça isso aqui, mas uma idéia é você dar o null no objeto, chamar o gc() e na hora de obter uma nova instância do dito cujo, você lança uma thread com um loop que verifica se o retorno do getInstance é a instância velha (como?), só saido do loop quando não for mais. Ou seja, você fica esperando o GC comer o objeto, sabe-se lá quando…hummm acho que não é mto legal não hehehehe…

frankmt

Pessoal,

eu sei que o uso de singletons provavelmente vai ocasionar um vazamento de memoria, mas no meu caso, estou usando singletons para criar os DAO’s da minha apliacao:

AnimalDAO.getInstance(). ...

Se eu nao usar singletons, vou ter a cada instanciacao, criar o DAO, utiliza-lo e colocar null nele depois.

Isso vale a pena?

Francisco

pcalcado

Não, use uma Factory ou IoC.

frankmt

O que é um IoC?

Outra pergunta, quando eu devo colocar null em um objeto depois de utiliza-lo? O GC nao deveria saber os objetos que nao estao sendo utilizados?

[]'s
Francisco

ceara

tbm tenho essa curiosidade…

dps de usar um objeto, seto null pra ele?? inútil fazer isso neh!?

L

http://blog.caelum.com.br/2007/01/03/atribuindo-null/

Criado 21 de setembro de 2006
Ultima resposta 19 de jan. de 2007
Respostas 37
Participantes 14