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;
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;
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;
[/quote]
Exatamente isso… e no final, depois do “crypto = null” eu chamo o GC com “System.gc();”
[quote=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?[/quote]
Sim, é ela. Existe um método sim o “Cryptomanager.reloadTokens()”. Mas ele nao funciona. Não me pergunte pq.
Vê o javadoc dele, e o código-fonte…
É 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?
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! ^^
Mas vc conseguiu resolver?
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^^
Em cód. nativo? Doido…
O que vc está falando das threads, é de fazer um loop até o GC rodar?
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??
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…
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?! ^^
Ué, o que eu tinha falado era isso aqui:
[quote=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…[/quote]
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
Não, use uma Factory ou IoC.
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
tbm tenho essa curiosidade…
dps de usar um objeto, seto null pra ele?? inútil fazer isso neh!?