Dúvida sobre critério e funcionamento do GC

7 respostas
C

Pessoal, estou com o seguinte problema:

Tenho um objeto que ao ser instanciado, no próprio construtor, passa sua referência para ser segura por outro objeto que contem uma coleção, no caso um HashMap.

O problema é o seguinte, preciso segurar a instância deste objeto mas não posso interferir no trabalho no GC, o que acontece é que meu objeto nunca é descarregado, mesmo saindo de escopo, pois tem um outro objeto com sua referência, no caso o objeto que tem a coleção. Deste modo, o metodo finalize() do meu objeto nunca é executado, e é exatamente nele que pretendo retirá-lo da coleção!

Não sei se tem algum design patern, ou algum recurso so System que eu possa usar para me referir a um objeto sem segurar explicitamente sua referência, de modo a não influenciar no GC?

Se alguém tiver uma luz…

7 Respostas

louds

Não dependa do finalize() para fazer qualquer coisa. Me parece que o teu software possui algum erro conceitual.

Talvez esse teu Map seja algum cache, use um WeakHashMap nesse caso.

maxguzenski

mas assim tu vai criar uma ilha de isolacao…

te garanto, se tu precisa usar o finalize() da classe, tu nao projetou sua aplicacao direito.

explica melhor oq tu precisa disso?

C

Na realidade, preciso ter um objeto q se comporte como um monitor de outros objetos, cada objeto de uma classe minha especifica que foi instanciado deve ser monitorado pela coleção, de modo que a coleção consiga trocar mensagens com qualquer instancia a qualquer momento. Isto serve como um meio de outras classes do sistema acessarem a qualquer uma das instancias desta classe especifica.

Não é uma cache, é um monitor de objetos!

Pensei em utilizar um patern como o Observer por exemplo, mas também não me adianta, pois eu teria q espelhar cada o estado de cada objeto na coleção, já que a comunicação entre os objetos se daria na medida em que o ‘observado’ tivesse seu valor alterado e não a qualquer momento, quando a coleção desejasse consultar seu valor!

Tentei até armazenar na coleção apenas o número da instância do meu objeto, para não interferir no GC, mas daí não consigo recuperar o objeto através deste número. Isto também serviria, alguém sabe como posso fazer isso? recuperar a referência para algum objeto através do seu IdentityHashCode?

por exemplo:

Eu guardaria o número assim: (isso existe)

int i = System.identityHashCode(meuObjeto));

E recuperaria meu obj assim: (isso não existe)
Object meuObjetoRecuperado = System.ObjectByIdentityHashCode(i);

Grato!

T

Bom, tem umas classes chamadas java.util.WeakHashMap, java.lang.ref.WeakReference, java.lang.ref.PhantomReference, java.lang.ref.SoftReference, veja o que elas fazem - não sei exatamente qual é a distinção entre todos esses tipos de referência (Weak, Phantom e Soft). Nunca cheguei a usar essas classes.

E

bom, se o objeto coleção está segurando seu objeto e você sabe que ele não será mais usado dê um valor null para ele o GC vai dar cabo rapidinho.

louds

Quem é o creator dos teus objetos observados?
Quem controla o ciclo de vida deles?
Quem é o container dos teus objetos?

Responde essas perguntas que voce vai saber como resolver teu problema.

C

thingol, obrigado pela dica dos tipos de referências, certamente vou verificar isto,

louds, obrigado pelas perguntas, você me força a explicar melhor meu sistema.

Eddie, não é tão simples assim, vou explicar melhor!

Meu sistema é um Framework que provê classes para serem utilizadas pelo desenvolvedor de aplicações Java. Estas classes representam os tipos primitivos de dados, como a classe String por exemplo.
Desta maneira, como levantou o louds, não sou eu o creator dos objetos instanciados, é o programador que utilizará o framework, ainda nesta linha de raciocínio, não tenho como controlar com recursos próprios o ciclo de vida destes objetos, preciso de recursos do sistema.
No momento em que meu objeto é instanciado, ele passa sua referência ao monitor, que deve ter um meio de acesso a este objeto, já que deve executar ações e consultas ao estados destes objetos quando requisitado.’

Não sei se fui claro, a questão é que meus objetos estarão disponíveis para serem instanciados a qualquer momento, sendo descarregados normalmente como qualquer outro objeto no momento que perdem escopo, sem que eu tome conhecimento, pelo menos por enquanto, isso é que eu preciso. Neste caso tenho problemas, porque preciso me referenciar a estes objetos mas não posso atrapalhar o trabalho normal do GC.

Obrigado a todos pela atenção!
Se puderem continuar me ajudando eu agradeço!

Cássio

Criado 27 de outubro de 2004
Ultima resposta 28 de out. de 2004
Respostas 7
Participantes 5