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???
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.
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:
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. ^^
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[/quote]
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?
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[/quote]
“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?
[quote=Maurício Linhares]
“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?
Que tal você explicar melhor o seu problema?[/quote]
falando em singletons eles foram definidos como uma doenca ja … Singleontiti :twisted:
[quote=Maurício Linhares]
“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?
Que tal você explicar melhor o seu problema?[/quote]
É 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… ^^
Sua lista não será recolhida pelo lixeiro antes de ter todos seus membros anulados. E mesmo assim não será recolhida imediatamente.
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.
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.
[quote=Luca]
Basta fazer copy&paste entre as tags Code.
Luca[/quote]
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.
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.
[quote=TiagoFoil][quote=Maurício Linhares]
“getInstance()”? Isso é uma implementação de singleton? Com estado dependendo do contexto?
Que tal você explicar melhor o seu problema?[/quote]
É 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… ^^[/quote]
Então essa classe que você quer re-instanciar é o tal Singleton da Mozilla? Não existe um método pra atualizar a lista?
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…