Upload
unguryan-vitaliy
View
26
Download
2
Embed Size (px)
Citation preview
Типы ссылок.
Виталий Унгурян [email protected]
OutOfMemoryError
Все java - разработчики, рано или поздно, встречаются с пресловутой ошибкой OutOfMemoryError. После этой встречи мы начинаем более бережно относится к используемой памяти и экономить ее.
Ссылки в Java
Жёсткая (strong) ссылка.StringBuffer buffer = new StringBuffer();Если объект доступен через цепочку ссылок (как например объект, на который ссылается переменная buffer), то такая ссылка называется жёсткой и сборщик мусора не станет уничтожать такой объект.
Ссылки в Java
Strongly reachable (прямо доступный) – к такому объекту можно получить доступ только посредством прямой ссылки.
Ссылки в Java
Softly reachable (мягко доступный) – к такому объекту нельзя получить доступ через прямую ссылку, он может быть доступен только посредством SoftReference.
Weakly reachable (слабо доступный) – не может быть доступным через прямую и SoftReference ссылки. К такому объекту можно обратиться лишь посредством WeakReference.
Ссылки в Java
Phantomly reachable (фантомно дотупный) – объект соответственно не может быть доступен посредством SoftReference и WeakReference, поскольку его использование было завершено. Обратиться к нему можно лишь при помощи PhantomReference ссылки.
Clear – установка полей объекта в null и объявление объекта, к которому происходит обращение, как finalizable.
Взаимодействие сборщика мусора и ссылок
//Создает прямую ссылку на объектMyObject obj = new MyObject(); //1
//Создает reference queueReferenceQueue rq = new ReferenceQueue(); //2 //Создает weakReference к obj и соответствующий наш reference queueReference wr = new WeakReference(obj, rq); //3
Методы Reference
get() — вернёт strong-ссылку на объект StringBuilder в случае если GC не удалил этот объект из памяти. В другом случае вернётся null. clear() — удалит ссылку на объект StringBuilder (то есть soft - ссылки на этот объект больше нет)
GC и Reference
GC начал свою работу и проходит по всем объектам в куче. В случае, если объект в куче это Reference, то GC помещает этот объект в специальную очередь в которой лежат все Reference объекты. После прохождения по всем объектам GC берет очередь Reference объектов и по каждому из них решает удалять его из памяти или нет.
ReferenceQueue
Позволяет отслеживать момент, когда GC определит что объект более не нужен и его можно удалить. Именно сюда попадает Reference объект после того как объект на который он ссылается удален из памяти. При создании Reference мы можем передать в конструктор ReferenceQueue, в который будут помещаться ссылки после удаления.
Мягкие ссылки (SoftReference)
GC гарантировано удалит с кучи все объекты, доступные только по soft-ссылке, перед тем как бросит OutOfMemoryError. Reference<Thing> thing = new SoftReference<Thing>(new Thing());
Мягкие ссылки (SoftReference)
Объекты удаляются в порядке времени последнего обращения по ссылке, т.е. ссылки по которым давно не обращались удаляются первыми. Это делает SoftReference удобными ссылками для мягкого кеширования объектов.
Слабые ссылки (WeakReference)
Слабая ссылка - это ссылка, которая недостаточно сильна чтобы объект не собирался сборщиком мусора.
Reference<Thing> weakThing = new WeakReference<Thing>(thing);
Фантомные ссылки (PhantomReference)
Связь с объектами в этих ссылках такая слабая, что вы даже не сможете получить эти объекты - get() метод всегда будет возвращать null. Reference<Thing> thing = new PhantomReference<Thing>(new Thing(), queue);
Фантомные ссылки (PhantomReference)
Связь с объектами в этих ссылках такая слабая, что вы даже не сможете получить эти объекты - get() метод всегда будет возвращать null.
Фантомные ссылки (PhantomReference)
Единственная область применения этих ссылок в отслеживании момента, когда ссылка помещается в очередь ReferenceQueue. Когда это происходит вы можете быть уверенным, что объект, на которой указывает ссылка, уничтожен. PhantomReference<Thing> thing = new PhantomReference<Thing>(new Thing(), queue);
Резюме
Ссылочные классы могут оказаться достаточно полезными, при условии использования их в нужных ситуациях. Однако гарантия их корректной работы в некоторой степени ограничивается тем фактом, что их работа полагается на непредсказуемое поведение «сборщика мусора».
Резюме
Эффективность использования этих классов также в значительной степени зависит от правильности выбранного способа для программирования их работы; крайне важно понять как работают данные классы для того чтобы правильно работать с ними.