Язык программирования Java Дмитриев Андрей Владиславович
Сборка мусора java.lang.ref Доступность объектов Ссылки System.gc() Finalizer
Введение void initFrame(){ Frame f = new Frame(A test); … //дальнейшая работа с окном } //завершение метода без явного удаления объекта: локальный объект становится недоступным. Сборщик мусора отслеживает все такие объекты и удаляет их
Особенности сборщика мусора Существует несколько основных методологий сборки мусора(поколения, инкрементация) Нет гарантированных механизмов управления Нет гарантий вызова Точное время вызова непредсказуемо Гарантированно должен работать только при недостатке памяти
Обзор java.lang.ref Содержит классы для обеспечения гибкого взаимодействия со сборщиком мусора Reference – абстрактный базовый класс –WeakReference –SoftReference –PhantomReference
Доступность объектов
Типы ссылок(сильная) Frame f = new Frame(A test); f = null; //очистка ссылки До тех пор пока переменная f существует, не равна null, или находится в области видимости, объект считается доступным
Типы ссылок(слабая) WeakReference wr = new WeakReference(new Frame(A test)); Жесткая ссылка на объект может быть восстановлена методом get() Если возвращаемое значение – null значит, что сборщик мусора финализировал данный объект Удаление слабо доступного объекта может не произойти в первый раз, когда GC его обнаружил Наличие слабой ссылки на объект не препятствует его удалению
Типы ссылок(мягкая) Значение доступно по методу get(). Если возвращаемое значение – null значит, что сборщик мусора финализировал данный объект Наличие слабой ссылки на объект не препятствует его удалению Финализация, как правило, происходит при недостатке памяти Обычно используется для создания кэшей SoftReference sr = new SoftReference(new Frame(A test));
Типы ссылок(призрачная) Объект не подлежит восстановлению Используется для выполнения завершающих действий после удаления объекта Создается в связке с ReferenceQueue Метод get() всегда возвращает null PhantomReference pr = new PhantomReference(new Frame(A test), referenceQueue);
ReferenceQueue Это очередь ссылок на объекты, которые недоступны по жесткой ссылке Имеет методы: –poll() – чтение объекта из очереди, если таковой есть –remove()/remove(long timeout) – удаление объекта из очереди, если таковой есть
ReferenceQueue(пример) ReferenceQueue refQueue = NativeImage3.referenceQueue(); while (true) { NativeImage3 nativeImg = (NativeImage3) refQueue.remove(); nativeImg.dispose(); }
Метод Object.finalize() Каждый объект может переопределять метод, вызываемый перед удалением объекта из памяти Обычно используется для освобождения native ресурсов Нет гарантий относительно времени выполнения
finalize() (пример) class MyObject { protected void finalize() throws Throwable { System.out.println(this:"+this); }
System.gc() Указывает VM о желательности сборки мусора Не гарантирует начала работы GC Не рекомендуется для использования
Пример удержания ссылки MyObject obj = new MyObject(); ReferenceQueue rq = new ReferenceQueue(); WeakReference wr = new WeakReference(obj, rq); System.out.println("Poll: "+ rq.poll()); //вернет null System.gc();//можно повторить в цикле System.out.println("Poll: "+ rq.poll()); //вернет null System.out.println(Referent:"+wr.get());
Освобождение жесткой ссылки obj = null; System.gc(); System.out.println("Poll: "+ rq.poll()); //вернет obj System.out.println(Referent:"+wr.get()); //вернет null
Правда ли что… Сборка мусора может вносить непредвиденные задержки в работу программы Слабо(Weak) доступный объект можно восстановить (породить на него жесткую ссылку) У программиста нет механизмов воздействия на сборщик мусора
Сборка мусора Дмитриев Андрей Владиславович