Tenho uma dúvida quanto a esses 2… Na verdade acho que ja sei a resposta porque pelo que li e pelo que fiz funcionou, ma só para ter certeza vou perguntar… O GC só coleta um objeto se ele não estiver sendo acessado por nenhuma thread ativa certa? Estou com uma dúvida na seguinte instrução
dentro do método run dessa classe ObjRunnable podemos supor que tenham algumas instruções que demora 1 min para executar… No caso esse objeto thread não tem referência… seria alvo do GC, mas por outro lado ele É uma thread ativa que executa vários métodos…
É possível que algum objeto thread desses criados seja recolhido pelo GC antes de terminar a execução do método run de ObjRunnable?
Na realidade o critério usado pelo GC para coletar um objeto, não é se tem ou não uma Thread ativa acessando o objeto, e sim, se existe alguma referencia (excluindo ilhas) para aquele objeto… a partir do momento que nao existe mais nenhuma referencia para o objeto, ele não poderá ser acessado mais pelo aplicação, pelo simples fato de não haver nenhuma referencia para ele… então o GC pode coleta-lo…
BrunoBastosPJ
Opa jair, eu estava me confundindo com como ele usa o critério… seria com uma thread ativa, ou com uma acessável? Estou usando um objeto anônimo que é uma thread… o estranho é que funciona… vou fazer um teste aqui e falo as resposta
se você rodar o teste acima vai ver que mesmo solicitando a coleta de lixo varias vezes (mesmo sabendo que nao é garantido) a thread continua ativa… Eu li no livro da kathy alguma coisa sobre threads e o gc só que não lembro se ela fala sobre threads ativas ou sobre threads acessíveis…
Por outro lado a classe thread tem um método estático currentThread() que retorna a thread que está sendo executada, pode ser que a própria classe guarde uma referência dos objetos criados de uma forma estática, e por isso o GC não coleta a thread ativa…
O que você acha?
L
luBSPJ
Oi, pelo que andei vendo, eh sim dentro da thread que ele guarda a referência, parece que a prova para isso esta nesse código executado com java 1.4:
isso parece dar outOfMemory no java 1.4, comprovando que a Thread guarda sua referencia… embora eu não tenha testado se da problema, parece que na versão 5 ja foi corrigido…
se alguem puder fazer este teste na jre 1.4 e poder avisar depois se da mesmo erro, eu agradeceria, fiquei curioso hehe