Jump to content

Garbage Collector


Gurzi
 Share

Recommended Posts

Bem , penso ser do interesse de todos este aspecto, o Garbage collector  ?

Estou a seguir um ebook que está a falar disto e do finalize() ;

Coisas como logo após o main fazerem while(!Chair.f) , isto quer dizer o que ? enquanto não for criado um objecto com o nome f da classe Chair ?

Depois coisas como System.gc();

Só tenho pena que os livros falem de coisas que antes não falarem e nem se quer as expliquem, enerva-me de uma forma..

Já agora , acham o garbage util ? costumam usar o finalize() ???

//: c04:Garbage.java 
// Demonstration of the garbage 
// collector and finalization 

class Chair { 
  static boolean gcrun = false; 
  static boolean f = false; 
  static int created = 0; 
  static int finalized = 0; 
  int i; 
  Chair() { 
    i = ++created; 
    if(created == 47)  
      System.out.println("Created 47"); 
  } 

public void finalize() { 
    if(!gcrun) { 
      // The first time finalize() is called: 
      gcrun = true; 
      System.out.println( 
        "Beginning to finalize after " + 
        created + " Chairs have been created"); 
    } 
    if(i == 47) { 
      System.out.println( 
        "Finalizing Chair #47, " + 
        "Setting flag to stop Chair creation"); 
      f = true; 
    } 
    finalized++; 
    if(finalized >= created) 
      System.out.println( 
        "All " + finalized + " finalized"); 
  } 
} 

public class Garbage { 
  public static void main(String[] args) { 
    // As long as the flag hasn't been set, 
    // make Chairs and Strings: 
    while(!Chair.f) { 
      new Chair(); 
      new String("To take up space"); 
    } 
    System.out.println( 
      "After all Chairs have been created:\n" + 
      "total created = " + Chair.created + 
      ", total finalized = " + Chair.finalized); 
    // Optional arguments force garbage 
    // collection & finalization: 
    if(args.length > 0) { 
      if(args[0].equals("gc") ||  
         args[0].equals("all")) { 
        System.out.println("gc():"); 
        System.gc(); 
      } 

      if(args[0].equals("finalize") ||  
         args[0].equals("all")) { 
        System.out.println("runFinalization():"); 
        System.runFinalization(); 
      } 
    } 
    System.out.println("bye!"); 
  } 

}

Link to comment
Share on other sites

Por norma tanto o garbage collector como o finalize não são chamados pelo programador. São chamados pela máquina virtual quando é preciso e nada mais.

No caso do método finalize(), pode ter utilidade para "reviver" um objecto ou então efectuar qualquer operação específica aquando da morte de um objecto.

Um aviso, enquanto não dominares a linguagem não brinques com isso ;)

Link to comment
Share on other sites

O java já trabalha com o garbage colector "automáticamente"..., tudo o que deixa de estar "agregado" ao programa o garbage colector limpa da memória, coisa que não acontece com o C/C++ que tens de usar free's para garantir que não deixas lixo na memória. Isto é um dos trunfos do java para os Gurzis newbies (😄 ), pois é menos uma coisa BASTANTE IMPORTANTE para terem de se preocupar ;)

Imagina uma lista ligada em que uma das células passa a ficar desassociada à lista (a flutuar...), o garbage colector consegue identificar essa célula que corresponde a um bloco de memória e consegue ver que ela já não está acessivel pelo programa principal, logo encarrega-se de a limpar 😄 Daí o nome :P

abraços, HecKel

Link to comment
Share on other sites

Subscrevendo e acrescentando ao que anteriormente foi dito, é aliás IMPORTANTE ,salvo para raras excepções, que NÃO se chame o GC explicitamente, pelo menos no que toca a performance. As últimas versões da JVM estão optimizadas para tornar a Garbage Collection o mais rápida possível, ao fazer chamadas explicitas corremos o risco de piorar a performance dos nossos programas.

Fazer override ao método finalize hoje em dia quase já só se usa para métodos do tipo native (que chamam funcões classes de C ou C++) e servem precisamente para desalocar os recursos que estas classes consomem.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.