Dúvida com pergunta sobre GC [RESOLVIDO]

18 respostas
brunorota

Olá galera

Tem uma pergunta no masterexam que eu estou encucado, se alguem conseguir me explicar melhor agradeceria muito

sogue a pergunta

Dado o seguinte código:

public class Animal {
	
	public Animal a;
	
	public static void main(String args[]){
		
		Animal a1 = new Animal();
		Animal a2 = new Animal();
		Animal a3 = new Animal();
		
		a3.a = a2;
		a1.a = a3;
		a2.a = a1;
		
		a3 = null;
		a2 = null;
		a1 = null;
	}
}

Até que ponto há somente um objeto elegível para o GC?

pra mim logo após a chamada

a2 = null;

porque logo após essa linha de comando o objeto criado em

Animal a2 = new Animal();

Ninguém mais consegue ter acesso a esse objeto, logo ele está elegível para o GB

vai ter APENAS 1 objeto elegível para o GC, e a resposta correta é nunca neste programa

Alguém pode me explicar melhor essa pergunta?

Att.

18 Respostas

caio_ferreira

Depois da linha

a2 = null;

o objeto a1.a ainda referência o objeto a3 e objeto a1 ele mesmo, no caso tem dois objetos ainda.

a1.a --> a3
a1 --> a1

Temos dois objetos ainda, quando o a1 == null, ai não temos mais nenhum.

caio_ferreira

uma explicação melhor kra

Referencia —> Objeto

a1 -----> Objeto 1
a2 -----> Objeto 2
a3 -----> Objeto 3
a1.a —> Objeto 3
a2.a —> Objeto 1
a3.a —> Objeto 2

quando: a3 == null
a3 -----> agora refência null
a3.a —> agora refência null

quando: a2 == null
a2 -----> agora refência null
a2.a —> agora refência null

ainda temos dois objetos sendo referênciados

a1 --> referência Objeto 1
a1.a --> referência Objeto 3

brunorota

Então

É justamente oq eu faço pra ver quantos objetos existem e tals

Mais após a chamada

a2 = null

Nós já não temos 1 objeto elegível para a GC

Eu entendo elegível como o objeto pode ser removido da memória pelo GC, não estou certo?

E na resposta fala que em nenhum momento há apenas um objeto elegível para o GC

Agora só se elegível é quando há apenas 1 objeto que NÃO pode ser removido da memório pelo GC

Ae sim da certo

Porque temos um hora que temos 2 objetos que não pode ser removido e na proxima atribuição não temos mais nenhum, porque os 3 já vão estar prontos para serem removidos da memória

evertonsilvagomesjav

brunorota:
Então

É justamente oq eu faço pra ver quantos objetos existem e tals

Mais após a chamada

a2 = null

Nós já não temos 1 objeto elegível para a GC

Eu entendo elegível como o objeto pode ser removido da memória pelo GC, não estou certo?

E na resposta fala que em nenhum momento há apenas um objeto elegível para o GC

Agora só se elegível é quando há apenas 1 objeto que NÃO pode ser removido da memório pelo GC

Ae sim da certo

Porque temos um hora que temos 2 objetos que não pode ser removido e na proxima atribuição não temos mais nenhum, porque os 3 já vão estar prontos para serem removidos da memória

Quando a2 = null, vc tem um objeto elegivel para o GC sim.

brunorota

Ops quer dizer nós já temos apenas 1 objeto elegível para o GC

E a resposta correta é que nesse código NUNCA teremos APENAS 1 objeto elegível para o GC

Sera q foi um erro do MasterExam?

evertonsilvagomesjav

brunorota:
Ops quer dizer nós já temos apenas 1 objeto elegível para o GC

E a resposta correta é que nesse código NUNCA teremos APENAS 1 objeto elegível para o GC

Sera q foi um erro do MasterExam?

Exatamento. Na linha que a2 = null, existe apenas o objeto a2 elegivel para a coleta. Pq quando a3 recebeu null á variavel “a” fica em uma ilha de isolamento e nao pode mais ser acessada portanto á unica referencia do objeto referenciado por a2 é o proprio a2, e quando a2 = null nao existe mais referencia nenhuma para este objeto.

jayrmotta

oO

evertonsilvagomesjav

jayrmotta:
brunorota,

boa tarde … ao meu ver e desculpa minha ignorância caso não seja mas a resposta que atende a sua pergunta é após a3 = null; ser executado, pois ele pergunta:
Até que ponto há SOMENTE um objeto elegível para o GC?

neste ponto o a3 referenciava o objeto de a2 portanto somente ele está elegível ao garbage collector os demais se tornarão elegíveis nas linhas que seguem, porém a pergunta pede o ponto onde a SOMENTE UM e este momento é após a3 = null; executar, alguém concorda?

Abraços!

Não vc ta errado. Quando a3 = null o objeto a1.a ainda faz referencia ao mesmo objeto de a3 e o objeto a3.a que referenciava a2 ainda é referenciado por a2.

caio_ferreira

kra, nunca vamos ter 1 objeto só elegivel para a GC

compila o exemplo e veja

public class Animal {  
       
     public Animal a; 

private String nome;

Animal(String nome)
{
 this.nome = nome;
} 

public void setNome(String nome)
{
this.nome = nome;
}

public String getNome()
{
return nome;
}

       
     public static void main(String args[]){  
           
         Animal a1 = new Animal();  
         Animal a2 = new Animal();  
         Animal a3 = new Animal();  
           
         a3.a = a2;  
         a1.a = a3;  
         a2.a = a1;  
           
         a3 = null;  
         a2 = null;  
         //a1 = null;

System.out.println(a1.a.getNome());
System.out.println(a1.getNome());  
     }  
}
evertonsilvagomesjav
billcaio:
kra, nunca vamos ter 1 objeto só elegivel para a GC

compila o exemplo e veja

public class Animal {  
       
     public Animal a; 

private String nome;

Animal(String nome)
{
 this.nome = nome;
} 

public void setNome(String nome)
{
this.nome = nome;
}

public String getNome()
{
return nome;
}

       
     public static void main(String args[]){  
           
         Animal a1 = new Animal();  
         Animal a2 = new Animal();  
         Animal a3 = new Animal();  
           
         a3.a = a2;  
         a1.a = a3;  
         a2.a = a1;  
           
         a3 = null;  
         a2 = null;  
         //a1 = null;

System.out.println(a1.a.getNome());
System.out.println(a1.getNome());  
     }  
}

à questão é o objeto a2, quando a2 = null ninguem mais referencia o mesmo objeto que ele.

caio_ferreira

putz kra, to fazendo confusão, ta certo, quando a2 == null, não existe mais nenhuma referência a esse objeto. Nesse ponto, existe apenas um objeto qualificado para o Garbage Collector

evertonsilvagomesjav

Isso ai!

brunorota

Afinal a questão está errada ou não? o0 iahuihauhauih

G

Olá amigos, me confundi um pouco, só pra confirmar:

depois da execução da linha:
a2 = null;
ainda não há nenhum objeto elegível para Garbage Collector. Correto?
O objeto referente a a3 faz referência a a2 , a3 ainda está presente em a1 (então a1, contém a3 que contém a2)<= rs, certo!?

Coloquei o finalize no código abaixo, acho que assim é possível visualizar melhor:

public class Animal {

	public Animal a;
	public String name;

	public static void main(String args[]) {

		Animal a1 = new Animal();
		Animal a2 = new Animal();
		Animal a3 = new Animal();
		
		a1.name = "a1";
		a2.name = "a2";
		a3.name = "a3";

		a3.a = a2;
		a1.a = a3;
		a2.a = a1;

		a3 = null;
		a2 = null;
		//a1 = null; <= com essa linha comentada ainda não há nenhum objeto elegível
		System.gc();
	}

	public void finalize() {
		System.out.println(name);
	}
}

Abs.
Paulo Gervasio.

brunorota

Putz vdd hehehe

Não tinha reparado nisso =/

Esse exame ainda me mata iuhaiuhau

Já tirei a minha dúvida sobre essa pergunta =)

Obrigado Paulo e a todos que dedicaram um pouco de seu tempo para o tópico

Valeww até+

evertonsilvagomesjav

gervas-IO:
Olá amigos, me confundi um pouco, só pra confirmar:

depois da execução da linha:
a2 = null;
ainda não há nenhum objeto elegível para Garbage Collector. Correto?
O objeto referente a a3 faz referência a a2 , a3 ainda está presente em a1 (então a1, contém a3 que contém a2)<= rs, certo!?

Coloquei o finalize no código abaixo, acho que assim é possível visualizar melhor:

public class Animal {

	public Animal a;
	public String name;

	public static void main(String args[]) {

		Animal a1 = new Animal();
		Animal a2 = new Animal();
		Animal a3 = new Animal();
		
		a1.name = "a1";
		a2.name = "a2";
		a3.name = "a3";

		a3.a = a2;
		a1.a = a3;
		a2.a = a1;

		a3 = null;
		a2 = null;
		//a1 = null; <= com essa linha comentada ainda não há nenhum objeto elegível
		System.gc();
	}

	public void finalize() {
		System.out.println(name);
	}
}

Abs.
Paulo Gervasio.

Cara como nao tem nenhum objeto sendo que a3.a estava referenciando o mesmo objeto que a2, e a3 recebendo null á variavel “a” de a3 fica em uma ilha de isolamento e nao pode ser mais acessado por tanto quando a2 recebe null o objeto fica elegivel para a coleta sim. Pra mim o exercicio ta errado.

G

Opa, blz?
Nessa classe Animal que eu alterei, se você for até a linha 22, poderá fazer o seguinte:

System.out.println(a1.a.a.name);
 //a1 = null; <= com essa linha comentada ainda não há nenhum objeto elegível

E ele te retornará a2. :slight_smile:
Ou seja a1 ainda tem uma referencia a a2.

Talvez você esteja confundindo o objeto em si com a referência ao objeto…
Quando digo a1,a2 ou a3 estou fazendo referência ao Objeto e deveria estar falando em algo do tipo (Animal@3e25a5, Animal@19821f e Animal@3e25a5)

Abs.
Paulo Gervasio.

evertonsilvagomesjav

Opa, blz?
Nessa classe Animal que eu alterei, se você for até a linha 22, poderá fazer o seguinte:

System.out.println(a1.a.a.name);
 //a1 = null; <= com essa linha comentada ainda não há nenhum objeto elegível

E ele te retornará a2. :slight_smile:
Ou seja a1 ainda tem uma referencia a a2.

Talvez você esteja confundindo o objeto em si com a referência ao objeto…
Quando digo a1,a2 ou a3 estou fazendo referência ao Objeto e deveria estar falando em algo do tipo (Animal@3e25a5, Animal@19821f e Animal@3e25a5)

Abs.
Paulo Gervasio.

kkkk é verdade, boa concepçao!!

Criado 17 de maio de 2010
Ultima resposta 19 de mai. de 2010
Respostas 18
Participantes 5