Garbage Collection

7 respostas
M

Oi Pessoal,

Estou com dificuldades para entender quando um objeto fica elegível para Garbage Collection (GC). Por exemplo, considere count = 5 no seguinte código…

public void process(int count)
{
   for ( int i = 1; i < count; i++ ) 
   {
      Object temp = " Hello "+i;
   }
}

Quantos objetos estariam elegíveis para GC após a execução do método?

Pra mim seriam 5: os 4 criados dentro do ‘for’ + a variável count. Porém a resposta foi nenhum…

Alguém saberia me explicar essa questão ou teria uma ótima referência sobre GC?

Desde já agradeço muito a todos!!!

7 Respostas

T

Onde é que você leu que é zero?

A rigor, seriam 4 x 4 = 16, porque para cada iteração são criados:

  • 1 StringBuffer (ou StringBuilder, depende da sua versão do JDK);
  • 1 String (resultado de StringBuffer.toString ou StringBuilder.toString);
  • e na criação de um objeto StringBuffer é criado 1 char[], assim como na criação de um objeto String.

A variável count é um “int” , não um objeto, portanto o garbage collector não irá limpar tal variável.

Não há objetos criados diretamente no heap.

Agora, se seu programa fosse:

public void process()
 {
    Object temp1 = "Hello" + 1;
    Object temp2 = "Hello" + 2;
    Object temp3 = "Hello" + 3;
    Object temp4 = "Hello" + 4;
 }

a resposta seria 0, porque todas as strings acima são constantes e ficam “internalizadas” no pool.

M

Vi essa questão no site http://www.richardchen.info/home/scjp/4.htm

ih cara, agora fiquei com outras dúvidas…

Pq então as seguintes strings não ficaram “internalizadas” no seguinte código?

  1. From the following code how many objects are eligible for garbage collection?
String string1 = Test;

String string2 = Today;

string1 = null;

string1 = string2;

Resposta: 1

Obrigado thingol! :wink:

T

Acho que você está pegando um material esquisito . Tem coisas respondidas certo e outras respondidas errado. Cuidado!

String string1 = "Test";
String string2 = "Today";
string1 = null;
string1 = string2;

Se for só isso mesmo, todas as strings acima referem-se a constantes internalizadas, portanto não haverá nenhuma string para ser limpada pelo Garbage Collector.

Java_Vinicius_Machin

mtp:
Vi essa questão no site http://www.richardchen.info/home/scjp/4.htm

ih cara, agora fiquei com outras dúvidas…

Pq então as seguintes strings não ficaram “internalizadas” no seguinte código?

  1. From the following code how many objects are eligible for garbage collection?
String string1 = Test;

String string2 = Today;

string1 = null;

string1 = string2;

Resposta: 1

Obrigado thingol! :wink:

Neste caso somente um objeto se torna elegível para ser coletado pelo “lixeiro” (coletor de lixo). Este objeto é o String “Test” pois ele não possui mais nenhuma variável de referência apontando para si próprio, tornando se assim elegível, isso não garante 100% de chance de ser coletado.
lembre se: um objeto se torna elegível para ser coletado sempre quando não houverem mais variáveis de referência apontando para o objeto.
Mas eu não tenho certeza disso porque os objetos String não foram criados com new. >>>>

ps:Thingol parabens cara, que explicação bicho!!!

T

Eu trapaceei porque compilei o código do mtp e “disassemblei” com o javap para ver o que ele estava fazendo na verdade. Além disso olhei o fonte do JDK.
Tem muitas coisas que não consigo saber só de olhar, portanto uso esses truques. (Sou muito preguiçoso)
Agora com o Java 5 tem mais coisas “por debaixo dos panos” que o compilador faz por mim, então para saber exatamente o que ocorre eu preciso realmente ver a saída do compilador.

louds

Veja que a JVM pode coletar Strings que sofreram intern, a da Sun faz isso desde sempre.

M

Pessoal, muito obrigado pela ajuda de vcs!

Um grande abraço!

Criado 11 de julho de 2005
Ultima resposta 12 de jul. de 2005
Respostas 7
Participantes 4