18
Типы ссылок. Виталий Унгурян [email protected]

Reference - типы ссылок

Embed Size (px)

Citation preview

Page 1: Reference -  типы ссылок

Типы ссылок.

Виталий Унгурян [email protected]

Page 2: Reference -  типы ссылок

OutOfMemoryError

Все java - разработчики, рано или поздно, встречаются с пресловутой ошибкой OutOfMemoryError. После этой встречи мы начинаем более бережно относится к используемой памяти и экономить ее. 

Page 3: Reference -  типы ссылок

Ссылки в Java

Жёсткая (strong) ссылка.StringBuffer buffer = new StringBuffer();Если объект доступен через цепочку ссылок (как например объект, на который ссылается переменная buffer), то такая ссылка называется жёсткой и сборщик мусора не станет уничтожать такой объект.

Page 4: Reference -  типы ссылок

Ссылки в Java

Strongly reachable (прямо доступный) – к такому объекту можно получить доступ только посредством прямой ссылки.

Page 5: Reference -  типы ссылок

Ссылки в Java

Softly reachable (мягко доступный) – к такому объекту нельзя получить доступ через прямую ссылку, он может быть доступен только посредством SoftReference.

Weakly reachable (слабо доступный) – не может быть доступным через прямую и SoftReference ссылки. К такому объекту можно обратиться лишь посредством WeakReference.

Page 6: Reference -  типы ссылок

Ссылки в Java

Phantomly reachable (фантомно дотупный) – объект соответственно не может быть доступен посредством SoftReference и WeakReference, поскольку его использование было завершено. Обратиться к нему можно лишь при помощи PhantomReference ссылки.

Clear – установка полей объекта в null и объявление объекта, к которому происходит обращение, как finalizable.

Page 7: Reference -  типы ссылок

Взаимодействие сборщика мусора и ссылок

//Создает прямую ссылку на объектMyObject obj = new MyObject(); //1

//Создает reference queueReferenceQueue rq = new ReferenceQueue(); //2 //Создает weakReference к obj и соответствующий наш reference queueReference wr = new WeakReference(obj, rq); //3

Page 8: Reference -  типы ссылок

Методы Reference

get() — вернёт strong-ссылку на объект StringBuilder в случае если GC не удалил этот объект из памяти. В другом случае вернётся null. clear() — удалит ссылку на объект StringBuilder (то есть soft - ссылки на этот объект больше нет) 

Page 9: Reference -  типы ссылок

GC и Reference

GC начал свою работу и проходит по всем объектам в куче. В случае, если объект в куче это Reference, то GC помещает этот объект в специальную очередь в которой лежат все Reference объекты. После прохождения по всем объектам GC берет очередь Reference объектов и по каждому из них решает удалять его из памяти или нет.

Page 10: Reference -  типы ссылок

ReferenceQueue

Позволяет отслеживать момент, когда GC определит что объект более не нужен и его можно удалить. Именно сюда попадает Reference объект после того как объект на который он ссылается удален из памяти. При создании Reference мы можем передать в конструктор ReferenceQueue, в который будут помещаться ссылки после удаления.

Page 11: Reference -  типы ссылок

Мягкие ссылки (SoftReference)

GC гарантировано удалит с кучи все объекты, доступные только по soft-ссылке, перед тем как бросит OutOfMemoryError. Reference<Thing> thing = new SoftReference<Thing>(new Thing());

Page 12: Reference -  типы ссылок

Мягкие ссылки (SoftReference)

Объекты удаляются в порядке времени последнего обращения по ссылке, т.е. ссылки по которым давно не обращались удаляются первыми. Это делает SoftReference удобными ссылками для мягкого кеширования объектов.

Page 13: Reference -  типы ссылок

Слабые ссылки (WeakReference)

Слабая ссылка - это ссылка, которая недостаточно сильна чтобы объект не собирался сборщиком мусора.

Reference<Thing> weakThing = new WeakReference<Thing>(thing);

Page 14: Reference -  типы ссылок

Фантомные ссылки (PhantomReference)

Связь с объектами в этих ссылках такая слабая, что вы даже не сможете получить эти объекты - get() метод всегда будет возвращать null. Reference<Thing> thing = new PhantomReference<Thing>(new Thing(), queue);

Page 15: Reference -  типы ссылок

Фантомные ссылки (PhantomReference)

Связь с объектами в этих ссылках такая слабая, что вы даже не сможете получить эти объекты - get() метод всегда будет возвращать null.

Page 16: Reference -  типы ссылок

Фантомные ссылки (PhantomReference)

Единственная область применения этих ссылок в отслеживании момента, когда ссылка помещается в очередь ReferenceQueue. Когда это происходит вы можете быть уверенным, что объект, на которой указывает ссылка, уничтожен. PhantomReference<Thing> thing = new PhantomReference<Thing>(new Thing(), queue);

Page 17: Reference -  типы ссылок

Резюме

Ссылочные классы могут оказаться достаточно полезными, при условии использования их в нужных ситуациях. Однако гарантия их корректной работы в некоторой степени ограничивается тем фактом, что их работа полагается на непредсказуемое поведение «сборщика мусора».

Page 18: Reference -  типы ссылок

Резюме

Эффективность использования этих классов также в значительной степени зависит от правильности выбранного способа для программирования их работы; крайне важно понять как работают данные классы для того чтобы правильно работать с ними.