Duvida GC

19 respostas
R

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]

19 Respostas

A

nenhum objeto

Omeganosferatu

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 ?

A

vdd vc quis dizer aqui neh?

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

nbluis

Um…

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

esse new OO2() não é referenciado.

R

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

R

Obrigado galera.

Omeganosferatu

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…

maquiavelbona

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…

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é!

sergiotaborda

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.

R

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

Flasoft

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…

Omeganosferatu

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

sergiotaborda

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)…

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.

1112

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:

R

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:

R

Pessoal, novamente obrigado.

Flasoft

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

Valeu e obrigado, obrigado…

R

aeee parabens!! \o/

caiu uma questao dessa sobre GC com inner nao? hehehe

Flasoft

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…

Criado 11 de junho de 2007
Ultima resposta 18 de jun. de 2007
Respostas 19
Participantes 9