Принятый ответ хорош, я просто хотел добавить, что теперь есть способ завершить работу, даже не используя ее вообще.
Посмотрите на "Справочные" классы. Слабая ссылка, фантомная ссылка и мягкая ссылка.
Вы можете использовать их, чтобы сохранить ссылку на все ваши объекты, но эта ссылка ОДНА раз не остановит GC. Неплохо то, что вы можете вызывать метод, когда он будет удален, и этот метод может быть гарантированно для вызова.
Что касается завершения:
Я использовал finalize один раз, чтобы понять, какие объекты были освобождены. Вы можете играть в некоторые аккуратные игры со статикой, подсчетом ссылок и тому подобным - но это было только для анализа, но следите за кодом, подобным этому (не только в финализации, но именно там вы, скорее всего, его увидите):
public void finalize() {
ref1 = null;
ref2 = null;
othercrap = null;
}
Это признак того, что кто-то не знал, что делал. Такая «очистка» практически никогда не нужна. Когда класс GC'd, это делается автоматически.
Если вы найдете такой код в финальной версии, это гарантирует, что тот, кто его написал, был в замешательстве.
Если это где-то в другом месте, возможно, что код является корректным исправлением для плохой модели (класс остается в течение долгого времени, и по некоторым причинам вещи, на которые он ссылается, должны были быть вручную освобождены до того, как объект будет собран GC) , Обычно это потому, что кто-то забыл удалить слушателя или что-то в этом роде и не может понять, почему их объект не является GC, поэтому он просто удаляет вещи, на которые он ссылается, пожимает плечами и уходит.
Это никогда не должно использоваться, чтобы убрать вещи "Быстрее".