No nosso próximo passo iremos estudar os destrutores. Aprenderemos a utilizá-los no Java e descobriremos quais são suas diferenças com relação às outras linguagens orientadas a objetos.
Vamos criar um exemplo que permite uma quantidade arbitrária de objetos do
tipo String, onde quando ocorre uma nova instanciação faz sair do
escopo a anterior. Neste programa podemos passar dois argumentos, a quantidade
de objetos a serem instanciados, ou seja, número de Strings.
O segundo argumento indica que iremos forçar uma chamada ao coletor de lixo a
cada instanciação. Sem argumentos ele assume a primeira com valor 10, sendo
que para cada instanciação ele exibe um caráter "-".
//GCTeste.java
public class GCTeste {
public static void main(String args[]) {
String c;
int max = 10;
boolean force = false;
try {
max = Integer.parseInt(args[0]);
force = args.length > 1;
}
catch(Exception e) {
System.out.println("Usando valor default");
}
System.out.println("Iniciando criacao de "+max+" objetos:");
for(int i=0; i<max; i++) {
System.out.print("-");
c = new String("Coletor Automatico");
if(force) {
System.gc();
}
}
System.out.println("\nFim");
}
}
Agora devemos compilar o programa com o comando:
$ javac GCTeste.java
Depois de efetuada a compilação, vamos testar uma valor para que a memória se esgote
e o gc interfira:
$ java -verbose:gc GCTeste 10000
A execução irá retornar entre as instanciações representadas por "-" a atuação do gc.
Agora com um único objeto podemos fazer:
$ java -verbose:gc GCTeste 1 s
Iremos obter as seguintes mensagens:
Iniciando criacao de 1 objetos:
-[Full GC 250K->135K(1984K), 0.0119571 secs]
[1] Comentário enviado por pcalcado em 31/05/2004 - 21:56h
A regra básica para se usar destrutores em Java é: *não* use. System.gc() apenas sugere à VM que é hora de usar o gc [algo como um modificador register em C/C++]. Seu código não deve, em hipótese nenhuma,d epender da execução do método finalize().
[3] Comentário enviado por Czuber em 01/06/2004 - 16:10h
Gostei do artigo!
Tenho uma dúvida, a diferença entre chamar o método finalize() e o System.gc...
O System.gc serve para todos os objetos q estaum com null (pelo exemplo que vc deu) e o finalize serve só para o objeto pelo qual chamei esse método?
Obrigado!
[]s
[8] Comentário enviado por engos em 08/07/2004 - 14:15h
Não li ainda o artigo 7, mas até agora to vendo que a qualidade tá caindo...
Os outros nem comentei porque estavam até que bons, mas esse ficou fraco na minha opnião... espero que seja a única. :)
Até agora não deu para entender quando o gc vai entrar em ação e o que ele realmente faz, pelo que percebi só seta null nos valores, mas não é um destructor propriamente dito, to certo?