• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

Garbage Collector

4 mensagens neste tópico

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

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!"); 
  } 

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 (:D), 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 :D Daí o nome :P

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora