Duvida Sobre Garbage Colector

4 respostas
sidney.tavares

Ola amigos, estou aqui novamente para pedir auxilio com uma questao de simulado, me deparei com este exercicio:

public class Test2 {
	public void genNumbers() {
		ArrayList numbers = new ArrayList();
		for (int i = 0; i < 10; i++) {
			int value = i * ((int) Math.random());
			Integer intObj = new Integer(value);
			numbers.add(intObj);
		}
		System.out.println(numbers);
	}
}

A questao trata de linha de código que marca o primeiro ponto que um objeto referenciado por intObj se torna um candidato para o coletor de lixo?
Dente as opcoes eu assinalei que o objeto nao e candidato ao coletor de lixo, pois segundo a descricao um objeto esta qualificado para o coletor de lixo quando nenhum thread ativo puder acessa-lo, porem sendo honesto eu marquei a resposta devido ao fato de nao haver um metodo main no programa, ou seja, nao ha thread ativo. estou certo? Obrigado desde ja.

4 Respostas

visola

Acho que não sidney. Quando ele pergunta quais objetos são elegíveis para serem coletados, acho que ele quer dizer quando uma thread esteja passando, ou seja, quando o código está sendo executado. Se não tem thread, não tem execução. O código é só um amontoado de bytes e aí não faz sentido pensar em coletor de lixo.
Outro ponto importante, não é porque não tenha um método main, que uma classe nunca é executada, ou que nenhuma thread passa por ela.
main é só por onde o programa começa, ou seja, onde a primeira thread começa. Mas um applet por exemplo, não tem método main e é executado (tem threads), porque a primeira thread foi criada pelo próprio browser. Ou seja, sua classe pode estar sendo chamada por outra.
Quanto ao objeto intObj, ele está sendo criado dentro do escopo do for, mas ele está sendo adicionado dentro do ArrayList. E é aí que está o ponto desta questão. Cada objeto criado foi adicionado dentro do arraylist, e o arraylist aponta para cada um deles. Ou seja, nenhum deles será elegível enquando o ArrayList existir. Como o ArrayList só existe dentro do método, assim que a execução sair do método, o ArrayList e todos os objetos que ele contêm, serão elegíveis.

x111

visola:
Quanto ao objeto intObj, ele está sendo criado dentro do escopo do for, mas ele está sendo adicionado dentro do ArrayList. E é aí que está o ponto desta questão. Cada objeto criado foi adicionado dentro do arraylist, e o arraylist aponta para cada um deles. Ou seja, nenhum deles será elegível enquando o ArrayList existir. Como o ArrayList só existe dentro do método, assim que a execução sair do método, o ArrayList e todos os objetos que ele contêm, serão elegíveis.

Concordo. Ótima explicação!

O que acontece é que os objetos intObj não perdem sua referencia até o arrayList perder a sua referencia também!

Da uma pesquisada sobre referencias de objetos em java.

sidney.tavares

Ola visola,

Cara, gostei muito da sua explicacao, com certeza vai me ajudar muito, vou seguir meus estudos e vou procurar estudar mais sobre este ponto que ainda me confunde muito, de qualquer maneira voce ajudou um bocado. Abraco.

sidney.tavares

x@ndy,

Obrigado pela resposta cara, vou seguir sua dica de estudo sim.
Abraco.

Criado 20 de janeiro de 2011
Ultima resposta 20 de jan. de 2011
Respostas 4
Participantes 3