Remoção de objetos

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: