Duvida GC

Pessoal, dado o código abaixo, quantos objetos estão disponíveis para o GC a partir da linha 19? 0, 1 ou quantos? Alguem sabe me dizer?

01.public class OO2 extends OO2w {
02.   OO2 () {
03.      System.out.println("oo2");
04.   }
05.   public class OO3 {
06.      OO3 () {
07.         System.out.println("oo3");
08.      }
09.   }
10.   public class OO4 {
11.      OO4 () {
12.         System.out.println("oo4");
13.      }
14.   }
15.   public static void main(String[] args) {
16.      OO2 o2 = new OO2();
17.      OO3 o3 = o2.new OO3();
18.      OO4 o4 = new OO2().new OO4();
19.      System.out.println(o2);
20.      System.out.println(o3);
21.      System.out.println(o4);
22.   }
23.}
24.class OO2w {
25.   OO2w () {
26.     System.out.println("oo2w");
27.   }
28.}

[color=darkred]Editado pela moderação para incluir as tags Code para tornar o código legível [/color]

nenhum objeto

Hummm analisando bem acho que 1 objeto. Afinal de contas voce instancia um o2 pra poder instanciar um o4 … acho que o o2 vai pro GC pois a variavel referencia apenas o o4 … certo ?

vdd vc quis dizer aqui neh?

tb estou achando isso agora… mais e ai!!! como saberemos a vdd??? haha

Um…

OO4 o4 = new OO2().new OO4();

esse new OO2() não é referenciado.

Pois é… é bem essa a dúvida!!!
Eu estava na dúvida se o objeto OO2 era criado e já liberado para o GC.

Obrigado galera.

Entao justamente, por ele nao ser referenciado ele é criado e ja disponibilizado pro GC certo ???

Bom tenho quase certeza que é isso. A menos que esteja muito enganado hehehe…

Entao justamente, por ele nao ser referenciado ele é criado e ja disponibilizado pro GC certo ???

Bom tenho quase certeza que é isso. A menos que esteja muito enganado hehehe…[/quote]

Ele não é disponibilizado tão rápido assim. Quando a primeira vez que o GC for executado, ele identificará que o objeto está “livre” e o marcará para recolhimento. Numa segunda vez que o GC executar, ele será “limpo”, executando o método finalize() do objeto e agora realmente liberando memória. Muita gente ainda acha que logo depois de “liberado” o objeto e logo após a primeira execução do GC a memória será liberada por completo.

Para mais detalhes: http://www.guj.com.br/java.tutorial.artigo.28.1.guj

Até!

A resposta correta é realmente nenhum, porque todos os objetos são referenciados por objetos válidos (não elegíveis)

 OO4 o4 = new OO2().new OO4();

O código acima instância um OO2 para poder instanciar OO4 e embora o objeto OO2 não seja mais usado ele é referenciado por OO4 já que OO4 é uma inner class de OO2. Como tal , mesmo esse objeto auxiliar não é elegível.

Na minha opinição, o objeto “auxiliar” do tipo OO2 criado em

será sim elegível para o GC… pois ele está sendo utilizado apenas para criar OO4 (e sua referência não está sendo colocada em nenhuma variável), o objeto do tipo OO4 criado a partir daquele do tipo OO2 não tem nenhuma referência para ele (o fato de ele ser inner classe não garante isso)…

complementando o comentário do maquiavelbona:

Na verdade, não necessariamente após o método finalize() o objeto será liberado da memória, pois é possível que o método finalize() guarde a referência de this em um outro local (por exemplo, uma variável estática de outra classe) e, nesse caso, ainda não seria recolhido da memória… Além disso, vale lembra rque o método finalize() só é executado uma vez em cada objeto, o que significa que se ele ja executou o finalize() e foi guardada sua referência em um outro local… se pela segunda vez não tivermos mais nenhuma referência ao objeto, quando chegar o momento do GC fazer a coleta o objeto será removido sem executar novamente o método finalize().

[]'s

A resposta é 0(zero objetos estarão disponiveis para o gc).

pensem:

004 é inner de 002 e sendo assim tem acesso às variaveis de instancia e metodos do objeto do tipo 002 à qual ele foi referenciado no momento em que foi instanciado. Apesar de o obj 002 não possuir uma variavel de referencia que o aponte, ainda é possivel que o objeto 004 deseje acessar seus métodos ou variáveis, sendo assim ainda é necessário mante-lo na memória.

Concordam?

Me desejem boa sorte, pq amanhã é meu exame de SCJP…

Pootz quebraram meu paradigma aehuaehuea seis tem certeza???
bom espero que sim
boa sorte na prova…

[quote=RafaelVS]Na minha opinição, o objeto “auxiliar” do tipo OO2 criado em

será sim elegível para o GC… pois ele está sendo utilizado apenas para criar OO4 (e sua referência não está sendo colocada em nenhuma variável), o objeto do tipo OO4 criado a partir daquele do tipo OO2 não tem nenhuma referência para ele (o fato de ele ser inner classe não garante isso)…
[/quote]

Garante sim senhor. Dentro de OO4 tenho que poder executar o seguinte código


public algumMetodoDeOO4 (){
        OO2.this.algumMetodoDeOO2();
}

Para que isto seja possível, OO4 sempre tem uma referencia a OO2 que pode ser obtida com OO2.this . Se tem duvidas use um debugger e veja que existe uma variável dentro do OO4 que aponta para OO2.

O Flasoft e o sergiotaborda estão corretos.

O objeto OO2 criado na linha 18 é referenciado pelo OO4 interno. Ele só não seria se OO4 fosse static, mas aí até a declaração seria diferente.

Essa é uma questão que eu erraria fácil, com minha mania de ler rápido. :stuck_out_tongue:

Realmente, deixei-me enganar pela questão… o objeto OO2 ainda é referenciado pelo objeto OO4, mesmo não tendo nenhuma referência explícita. :oops:

Pessoal, novamente obrigado.

Arereêee… agora pessoal já sou SCJP 5… 73% na prova de ontem (14/06)…

Valeu e obrigado, obrigado…

aeee parabens!! \o/

caiu uma questao dessa sobre GC com inner nao? hehehe

Não caiu nada de inner class…

Caiu bastante fundamentos(E eu que achava que era bom nisto)… foi onde mais errei. E em Collection que achava que iria ir mau, foi onde foi melhor… vai entender…