Matar Instância na força bruta

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

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:

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

1 curtida

Chama o Chuck Norris que ele te resolve isso!

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

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. ^^

[quote=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[/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?

Vou estudar mais sobre o GC ^^

Brigadao

Um exemplo:

[code]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
}

}[/code]

[quote=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[/quote]

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

Que tal você explicar melhor o seu problema?

[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:

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

[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… ^^

Não use uma variavel estática e resolve

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

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:

[quote=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? ;)[/quote]

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

[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.

vlw ^^

Voltando ao assunto, pq vc precisa de um singleton?

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…