Типы ссылок.
Виталий Унгурян
unguryan@itstep.org
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 queue
ReferenceQueue rq = new ReferenceQueue(); //2
//Создает weakReference к obj и соответствующий наш reference
queue
Reference 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);
Резюме
Ссылочные классы могут оказаться
достаточно полезными, при условии
использования их в нужных ситуациях.
Однако гарантия их корректной работы в
некоторой степени ограничивается тем
фактом, что их работа полагается на
непредсказуемое поведение «сборщика
мусора».
Резюме
Эффективность использования этих
классов также в значительной степени
зависит от правильности выбранного
способа для программирования их
работы; крайне важно понять как
работают данные классы для того
чтобы правильно работать с ними.

Java. Интерфейс Reference - типы ссылок

  • 1.
  • 2.
    OutOfMemoryError Все java -разработчики, рано или поздно, встречаются с пресловутой ошибкой OutOfMemoryError. После этой встречи мы начинаем более бережно относится к используемой памяти и экономить ее.
  • 3.
    Ссылки в Java Жёсткая(strong) ссылка. StringBuffer buffer = new StringBuffer(); Если объект доступен через цепочку ссылок (как например объект, на который ссылается переменная buffer), то такая ссылка называется жёсткой и сборщик мусора не станет уничтожать такой объект.
  • 4.
    Ссылки в Java Stronglyreachable (прямо доступный) – к такому объекту можно получить доступ только посредством прямой ссылки.
  • 5.
    Ссылки в Java Softlyreachable (мягко доступный) – к такому объекту нельзя получить доступ через прямую ссылку, он может быть доступен только посредством SoftReference. Weakly reachable (слабо доступный) – не может быть доступным через прямую и SoftReference ссылки. К такому объекту можно обратиться лишь посредством WeakReference.
  • 6.
    Ссылки в Java Phantomlyreachable (фантомно дотупный) – объект соответственно не может быть доступен посредством SoftReference и WeakReference, поскольку его использование было завершено. Обратиться к нему можно лишь при помощи PhantomReference ссылки. Clear – установка полей объекта в null и объявление объекта, к которому происходит обращение, как finalizable.
  • 7.
    Взаимодействие сборщика мусораи ссылок //Создает прямую ссылку на объект MyObject obj = new MyObject(); //1 //Создает reference queue ReferenceQueue rq = new ReferenceQueue(); //2 //Создает weakReference к obj и соответствующий наш reference queue Reference wr = new WeakReference(obj, rq); //3
  • 8.
    Методы Reference get() —вернёт strong-ссылку на объект StringBuilder в случае если GC не удалил этот объект из памяти. В другом случае вернётся null. clear() — удалит ссылку на объект StringBuilder (то есть soft - ссылки на этот объект больше нет)
  • 9.
    GC и Reference GCначал свою работу и проходит по всем объектам в куче. В случае, если объект в куче это Reference, то GC помещает этот объект в специальную очередь в которой лежат все Reference объекты. После прохождения по всем объектам GC берет очередь Reference объектов и по каждому из них решает удалять его из памяти или нет.
  • 10.
    ReferenceQueue Позволяет отслеживать момент,когда GC определит что объект более не нужен и его можно удалить. Именно сюда попадает Reference объект после того как объект на который он ссылается удален из памяти. При создании Reference мы можем передать в конструктор ReferenceQueue, в который будут помещаться ссылки после удаления.
  • 11.
    Мягкие ссылки (SoftReference) GCгарантировано удалит с кучи все объекты, доступные только по soft- ссылке, перед тем как бросит OutOfMemoryError. Reference<Thing> thing = new SoftReference<Thing>(new Thing());
  • 12.
    Мягкие ссылки (SoftReference) Объектыудаляются в порядке времени последнего обращения по ссылке, т.е. ссылки по которым давно не обращались удаляются первыми. Это делает SoftReference удобными ссылками для мягкого кеширования объектов.
  • 13.
    Слабые ссылки (WeakReference) Слабаяссылка - это ссылка, которая недостаточно сильна чтобы объект не собирался сборщиком мусора. Reference<Thing> weakThing = new WeakReference<Thing>(thing);
  • 14.
    Фантомные ссылки (PhantomReference) Связьс объектами в этих ссылках такая слабая, что вы даже не сможете получить эти объекты - get() метод всегда будет возвращать null. Reference<Thing> thing = new PhantomReference<Thing>(new Thing(), queue);
  • 15.
    Фантомные ссылки (PhantomReference) Связьс объектами в этих ссылках такая слабая, что вы даже не сможете получить эти объекты - get() метод всегда будет возвращать null.
  • 16.
    Фантомные ссылки (PhantomReference) Единственнаяобласть применения этих ссылок в отслеживании момента, когда ссылка помещается в очередь ReferenceQueue. Когда это происходит вы можете быть уверенным, что объект, на которой указывает ссылка, уничтожен. PhantomReference<Thing> thing = new PhantomReference<Thing>(new Thing(), queue);
  • 17.
    Резюме Ссылочные классы могутоказаться достаточно полезными, при условии использования их в нужных ситуациях. Однако гарантия их корректной работы в некоторой степени ограничивается тем фактом, что их работа полагается на непредсказуемое поведение «сборщика мусора».
  • 18.
    Резюме Эффективность использования этих классовтакже в значительной степени зависит от правильности выбранного способа для программирования их работы; крайне важно понять как работают данные классы для того чтобы правильно работать с ними.