Прибирання сміття - і звільнення ресурсів в java, блог про шифрування

Так як об'єкти створюються динамічно за допомогою операції new. а унич-тожа автоматично, то бажано знати механізм ліквідації об'єктів і спосіб звільнення пам'яті. Автоматичне звільнення пам'яті, займаної об'єктом, виконується за допомогою механізму "збірки сміття". Коли ніяких посилань на об'єкт не існує, тобто все посилання на нього вийшли з області видимості програми, передбачається, що об'єкт більше не потрібен, і пам'ять, зайнята об'єктом, може бути звільнена. "Прибирання сміття" відбувається нерегулярно під час виконання програми. Форсувати "збірку сміття" неможливо, можна лише "рекомендувати" її виконати викликом методу System.gc () або Runtime.getRuntime (). Gc (). але віртуальна машина виконає очищення пам'яті тоді, коли сама вважатиме це зручним. Виклик методу System.runFinalization () призведе до запуску методу finalize () для об'єктів втратили все посилання.

Іноді об'єкту потрібно виконувати деякі дії перед звільненням пам'яті. Наприклад, звільнити зовнішні ресурси. Для обробки таких ситуацій можуть застосовуватися два способи: конструкція try-finally і механізм finalization. Конструкція try-finally є кращою, абсолютно надійною і буде розглянута в дев'ятому розділі. Запуск механізму finalization визначається алгоритмом збору сміття і до його безпосереднього виконання може пройти як завгодно багато часу. Через всього цього поведінка методу
finalize () може вплинути на коректну роботу програми, особливо при зміні JVM. Якщо існує можливість звільнити ресурси або виконати інші подібні дії без залучення цього механізму, то краще без нього обійтися. Віртуальна машина викликає цей метод завжди, коли вона збирається знищити об'єкт даного класу. Усередині методу finalize (). викликається безпосередньо перед звільненням пам'яті, слід визначити дії, які повинні бути виконані до знищення об'єкта.

Метод finalize () має наступну сигнатуру:

protected void finalize ()

Ключове слово protected забороняє доступ до finalize () коду, визначеного поза цього класу. Метод finalize () викликається тільки перед самою "складанням сміття", а не тоді, коли об'єкт виходить з області видимості, тобто заздалегідь неможливо визначити, коли finalize () буде виконаний, і недоступний об'єкт може займати пам'ять досить довго. В принципі цей метод може бути взагалі не виконано! Неприпустимо в додатку довіряти такому методу критичні за часом дії зі звільнення ресурсів.

public Manager (int value)

protectedvoid finalize () throws Throwable