Прежде всего, помните, что нет никакой гарантии, что финализация будет выполнена вообще для всех ваших объектов. Вы можете использовать его для освобождения памяти, выделенной в собственном коде, связанном с объектом, но для чистого Java-кода большинство сценариев использования только для выполнения «резервного» механизма очистки ресурсов. Это означает, что в большинстве случаев вы должны освобождать ресурсы вручную, и финализаторы могут действовать только как своего рода помощник для очистки, если вы забудете сделать это стандартным способом. Тем не менее, вы не можете использовать их в качестве единственного или основного механизма очистки. Более того, вы не должны писать код, правильность которого зависит от запуска финализаторов.
Объявление 1. Насколько я знаю, нет никаких гарантий относительно того, что поток вызывает finalize()
, хотя на практике это, вероятно, будет один из потоков GC.
Объявление 2. Разрешается создание новых объектов. Тем не менее, есть ряд ловушек с обработкой ссылок на объекты в финализаторах. В частности, если вы храните жесткую ссылку на финализируемый объект в каком-то живом объекте, вы можете предотвратить очистку объекта, собираемого для сбора мусора. Этот вид воскрешения объекта может привести к истощению ваших ресурсов, если он выйдет из-под контроля. Кроме того, следите за исключениями в finalize()
- они могут остановить финализацию, но у вашей программы нет автоматического способа узнать о них. Вам нужно обернуть код в блоки try-catch и распространять информацию самостоятельно. Кроме того, длительное время выполнения финализаторов может привести к наращиванию очереди объектов и потреблению большого количества памяти. Некоторые другие примечательные проблемы и ограничения описаны в этой статье JavaWorld .
Объявление 3. Не должно быть проблем с вызовом статических методов из финализаторов.
Объявление 4. Как уже упоминалось в пункте 2, можно предотвратить сбор мусора (воскресить его), поместив ссылку на него в другой живой объект во время финализации. Однако это непростое поведение и, вероятно, не очень хорошая практика.
Подводя итог, вы не можете полагаться на финализаторы для очистки ваших ресурсов. Вы должны справиться с этим вручную, и финализаторы в вашем случае могут в лучшем случае использоваться в качестве механизма резервного копирования, чтобы в некоторой степени скрыть после небрежного кодирования. К сожалению, это означает, что ваша идея сделать API лучше с помощью финализаторов для очистки ресурсов OpenGL, вероятно, не сработает.