GC e o objeto Thread

4 respostas
BrunoBastosPJ

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

while (true) {
    new Thread( new ObjRunnable() ).start();
}

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?

[ ]'s

4 Respostas

J

Olá Bruno,

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

BrunoBastosPJ

fiz o teste e ai está o código

public class Teste {
	public static void main( String[] args ) {
		new Thread( new TesteRun() ).start();
	}
}

class TesteRun implements Runnable {
	public void run() {
		while(true) {
			System.out.println("thread ativa");
                        System.gc();
		}
	}
}

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

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:

public class Teste
{
   public static void main(String[] args)
   {
       while ( true )
       {
         Thread t = new Thread();
       }
}

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

Criado 25 de outubro de 2006
Ultima resposta 26 de out. de 2006
Respostas 4
Participantes 3