Em linguagens de programação orientadas a objetos, a criação de objetos é um processo que determina a ocupação dinâmica de muitos pequenos segmentos de memória. Se esse espaço não fosse devolvido para reutilização pelo sistema, a dimensão de aplicações desenvolvidas com linguagens de programação orientadas a objetos estaria muito limitada.
As duas abordagens possíveis são dedicar essa tarefa ao programador ou deixar que o sistema seja o responsável por esta retomada de recursos. O problema da primeira abordagem é que o programador pode não considerar todas as possibilidades, ocasionando problemas como "vazamento de memória" (memory leak). Na segunda abordagem, recursos adicionais do sistema são necessários para a manutenção da informação necessária para saber quando um recurso pode ser retomado e para a execução do processo que retoma os recursos.
C++ é uma linguagem que adota a primeira estratégia. A remoção de objetos é efetivada explicitamente pelo programador (através do operador delete), que pode também especificar o procedimento que deve ser executado para a liberação de outros recursos alocados pelo objeto através de um método destructor.
Java, assim como Smalltalk e lisp, adota a abordagem de ter um garbage collector verificando que objetos não têm nenhuma referência válida, retomando o espaço dispensado para cada um desses objetos. Dessa forma, o programador não precisa se preocupar com a remoção explícita de objetos.
Adicionalmente, pode ser necessário liberar outros recursos que tenham sido alocados para o objeto. O método finalize() especifica o que deve ser feito antes do espaço do objeto ser retomado pelo garbage collector. Este método é definido na classe Object como protected. Usualmente, ao redefini-lo o programador deve também declará-lo como protected, pois não é um método que deva fazer parte da interface pública do objeto.
É preciso observar que o uso de finalize() ocorre através da redefinição de métodos. Assim, ao contrário do que acontece com construtores (onde o método correspondente na superclasse é automaticamente invocado), o método finalizador da superclasse deve ser invocado explicitamente (super.finalize()) ao final do corpo do finalizador local.
Uma observação adicional com relação a garbage collectors é que programadores não têm como atuar explicitamente sobre esse processo. No entanto, o programador pode:
public static void gc()
|
public static void runFinalization()
|