| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 16:19:36
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
Boa tarde, pessoal!
Eu estava resolvendo os exercícios do capítulo 3 (Assignments) e, logo no exercício 2, me deparei com a seguinte questão:
Given:
When // doStuff is reached, how many objects are eligible for GC?
A. 0
B. 1
C. 2
D. Compilation fails.
E. It is not possible to know.
F. An exception is thrown at runtime.
Seguindo o meu raciocínio (segundo a seqüência do código):
1. Um objeto CardBoard é criado e referenciado por c1. A variável de referência story aponta para um objeto Short de valor 5;
2. Outro objeto CardBoard é criado e referenciado por c2. A variável de referência story desse novo objeto aponta para o mesmo objeto Short, de acordo com a regra citada na página 236, que diz que o código abaixo é válido:
3. O método go(CardBoard) é chamado, com uma cópia da variável de referência c2;
4. c2, portanto, continua apontando para o mesmo CardBoard;
5. c3 não aponta para nenhum objeto;
6. c1 não aponta para nenhum objeto, portanto, como não é referenciado por mais nenhuma variável, o objeto apontado por c1 fica elegível para o Garbage Collector;
7. Mesmo se c1 for coletado, o Short para o qual c1.story apontava não fica elegível, pois c2.story ainda aponta para esse objeto!
8. Portanto, a resposta correta, seguindo esse raciocínio, é a resposta B (1)
Entretanto, a resposta correta segundo o livro é a resposta C (2), pois, segundo o livro, o objeto Short também seria elegível.
Colegas de comunidade, vocês concordam comigo?
|
Felipe de Alencar Albuquerque |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 16:26:51
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Você está certo - é a pegadinha em que o revisor do código caiu. Se o código original lesse:
Short story = 12345;
aí teríamos 2 objetos disponíveis para garbage collection.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 16:35:22
|
marcioa1
Virtual Machine Man
![[Avatar]](/images/avatar/169779d3852b32ce8b1a1724dbf5217d.jpg)
Membro desde: 29/11/2003 12:52:10
Mensagens: 736
Localização: Valinhos-SP
Offline
|
Jé fazem tres anos que me certifiquei, de forma que estou um pouco enferrujado.
Os objetos C2 e C3 não seriam igual a null ?
[editado] Pensando melhor, C2 não é null não [/editado]
Márcio
This message was edited 1 time. Last update was at 13/12/2007 16:37:14
|
SCJP 1.4, |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 16:46:45
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
o livro esta certo...
existem 2 objetos...
vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT
ok!?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 17:01:37
|
marcioa1
Virtual Machine Man
![[Avatar]](/images/avatar/169779d3852b32ce8b1a1724dbf5217d.jpg)
Membro desde: 29/11/2003 12:52:10
Mensagens: 736
Localização: Valinhos-SP
Offline
|
pardal_nb wrote:o livro esta certo...
existem 2 objetos...
vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT
ok!?
????????
Qual o nome desta referência do wrapper ? O que é referÊncia do wapper ? Quem é o wapper ?
???
Márcio
|
SCJP 1.4, |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 18:25:06
|
dreamspeaker
GUJ Ranger
![[Avatar]](/images/avatar/c862890c3fd3e3d203580.jpg)
Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline
|
pardal_nb wrote:o livro esta certo...
existem 2 objetos...
vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT
ok!?
Ué, e C3 não está null tbém?
Engraçado que eu colocaria a C(2) tbém de cara, mas por achar que C1 e C3 estão null.
|
André Barbosa
Para de encher o saco e vai doar sangue!
twitter |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2007 22:56:27
|
Deiverson
Debugger
Membro desde: 29/09/2004 10:50:28
Mensagens: 52
Offline
|
marcioa1 wrote:
pardal_nb wrote:o livro esta certo...
existem 2 objetos...
vc acertou q o C1 está sujeito ao coletor, SÓ QUE, dentro do seu objeto C1, vc tem uma variavel de instancia q utiliza de um wrapper...entao, assim como vc está deixando o C1 para o GC, vc tb está deixando a referencia do wrapper, SHORT
ok!?
????????
Qual o nome desta referência do wrapper ? O que é referÊncia do wapper ? Quem é o wapper ?
???
Márcio
hehehehe, tambem "viajei"
|
"Pouco me importa ser julgado por vocês ou por qualquer tribunal humano, de fato, nem eu julgo a mim mesmo." 1 Co 4:3 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 08:41:38
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
Vamos lá...
C3 não é NULO.... C3 faz referecia a C2...reparem que o metodo retorno uma referencia para o objeto q eh passado, q neste caso é :
C2... Por isso C3 nao eh nulo, ok?!
Seguindo...
Wrapper é um empacotador de tipos primitivos...faz com q tipos primitivos (int, flot, double ...) se tornem OBJETOS(Float, Integer ...)...
Na linha 2:
Temos uma variável de instância, ou seja do objeto instanciado...qnd nós instanciamos C1 (CardBoard c1 = new CardBoard(); ) ele terá essa variável de instancia com ele...isto é, "story" É uma var. de instancia de C1...e variaveis de instancia estão sujeitas ao GC....ok?!
seguindo..
qnd nós atribuimos um valor NULL para C1, ou seja, qnd tiramos o "controle remoto", o ponteiro, para o objeto no HEAP, nós estamos deixando para trás tb o nosso objeto story...(story é um objeto, e nao um tipo primitivo, notem, Short....se fosse short, ai a resposta seria 1)
certo pessoal?!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 11:08:59
|
dreamspeaker
GUJ Ranger
![[Avatar]](/images/avatar/c862890c3fd3e3d203580.jpg)
Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline
|
pardal_nb wrote:Vamos lá...
C3 não é NULO.... C3 faz referecia a C2...reparem que o metodo retorno uma referencia para o objeto q eh passado, q neste caso é :
C2... Por isso C3 nao eh nulo, ok?!
E como se explica isso?
|
André Barbosa
Para de encher o saco e vai doar sangue!
twitter |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 11:14:13
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
pardal_nb wrote:
Vamos lá...
[...]
certo pessoal?!
Pardal, tente entender essa lógica:
1. CardBoard.story é uma variável de instância, isso é correto. Mas repare que a a pergunta refere-se à quantidade de objetos que são elegíveis para o GC;
2. CardBoard.story não é um objeto, é uma variável de referência, portanto, no caso, aponta para um objeto do tipo Short;
3. Duas variáveis de referência dos tipos abaixo sempre apontarão para o mesmo objeto (para economia de memória):
3.1 Byte
3.2 Boolean
3.3 Character (de \u0000 a \u007F)
3.4 Short e Integer (de -128 a 127)
4. Temos dois objetos CardBoard criados. Os dois têm variáveis story que apontam para o mesmo objeto Short com valor 5;
5. Quando o CardBoard referenciado por c1 for coletado, a variável desse objeto story perderá sua referência com o Short, mas a variável story do objeto CardBoard referenciado por c2 ainda não perdeu sua referência, portanto esse Short não é elegível para o GC!!!
6. Se o código fosse como o descrito abaixo, realmente seriam dois objetos elegíveis para o GC:
|
Felipe de Alencar Albuquerque |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 11:18:28
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
dreamspeaker wrote:
pardal_nb wrote:Vamos lá... C3 não é NULO.... C3 faz referecia a C2...reparem que o metodo retorno uma referencia para o objeto q eh passado, q neste caso é : C2... Por isso C3 nao eh nulo, ok?!
E como se explica isso?
c3 é nulo! O método CardBoard.go(CardBoard) retorna uma variável de referência que não aponta para nada (nula)! c2 não é nulo porque o que é passado para o método é uma cópia de como chegar ao objeto referenciado por ele, portanto o valor de c2 (como chegar no objeto) continua inalterado, independente do que acontecer no método! O método, todavia, pode modificar o objeto.
This message was edited 1 time. Last update was at 14/12/2007 11:19:08
|
Felipe de Alencar Albuquerque |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 11:40:35
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
felipealbuquerque wrote:
2. CardBoard.story não é um objeto, é uma variável de referência, portanto, no caso, aponta para um objeto do tipo Short;
6. Se o código fosse como o descrito abaixo, realmente seriam dois objetos elegíveis para o GC:
entao me fala, quais?
se for como estão falando seriam os mesmos objetos
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 13:37:49
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
pardal_nb wrote:
felipealbuquerque wrote:
2. CardBoard.story não é um objeto, é uma variável de referência, portanto, no caso, aponta para um objeto do tipo Short;
6. Se o código fosse como o descrito abaixo, realmente seriam dois objetos elegíveis para o GC:
entao me fala, quais?
se for como estão falando seriam os mesmos objetos
O CardBoard referenciado por c1 e o Short (de valor 1680) referenciado por c1.story.
Novamente: quando o Short está entre -128 e 127, duas variáveis de referência apontam para o mesmo objeto. Fora desse intervalo, vários objetos são criados.
|
Felipe de Alencar Albuquerque |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 13:42:42
|
pardal_nb
Virtual Machine Man
Membro desde: 12/09/2006 08:26:06
Mensagens: 674
Offline
|
e o C3?!
ele continua a msm coisa, entao seriam 3 objetos, nao 2, certo?!
This message was edited 1 time. Last update was at 14/12/2007 13:43:18
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2007 13:56:34
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
pardal_nb wrote:e o C3?!
ele continua a msm coisa, entao seriam 3 objetos, nao 2, certo?!
Em momento algum foi criado um objeto para c3 referenciar. Note que, desde sua inicialização, c3 == null.
Um erro que costumam-se cometer é confundir as variáveis de referência com os objetos em si (e isso é explorado no exame). Quando declaramos uma variável de referência, não necessariamente criamos um objeto junto.
|
Felipe de Alencar Albuquerque |
|
|
 |
|
|