SlideShare a Scribd company logo
Типы ссылок.
Виталий Унгурян
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);
Резюме
Ссылочные классы могут оказаться
достаточно полезными, при условии
использования их в нужных ситуациях.
Однако гарантия их корректной работы в
некоторой степени ограничивается тем
фактом, что их работа полагается на
непредсказуемое поведение «сборщика
мусора».
Резюме
Эффективность использования этих
классов также в значительной степени
зависит от правильности выбранного
способа для программирования их
работы; крайне важно понять как
работают данные классы для того
чтобы правильно работать с ними.

More Related Content

Viewers also liked

List - списки
List - списки List - списки
List - списки
Unguryan Vitaliy
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
Unguryan Vitaliy
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
Unguryan Vitaliy
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
Unguryan Vitaliy
 
An Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAn Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in Java
Abhishek Asthana
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
Unguryan Vitaliy
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
Unguryan Vitaliy
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
Unguryan Vitaliy
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
Unguryan Vitaliy
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
Unguryan Vitaliy
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
Unguryan Vitaliy
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
Unguryan Vitaliy
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 

Viewers also liked (15)

List - списки
List - списки List - списки
List - списки
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
 
An Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAn Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in Java
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
 
Uml
UmlUml
Uml
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 

More from Unguryan Vitaliy

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
Unguryan Vitaliy
 
Stream API
Stream APIStream API
Stream API
Unguryan Vitaliy
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
Unguryan Vitaliy
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
Unguryan Vitaliy
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
Unguryan Vitaliy
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
Unguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
Unguryan Vitaliy
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
Unguryan Vitaliy
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
Unguryan Vitaliy
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
Unguryan Vitaliy
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
Unguryan Vitaliy
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
Unguryan Vitaliy
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
Unguryan Vitaliy
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
Unguryan Vitaliy
 
JSTL
JSTLJSTL
JSP
JSPJSP
JDBC
JDBCJDBC
Сервлеты
СервлетыСервлеты
Сервлеты
Unguryan Vitaliy
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
Unguryan Vitaliy
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
Unguryan Vitaliy
 

More from Unguryan Vitaliy (20)

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
 
Stream API
Stream APIStream API
Stream API
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
 
JSTL
JSTLJSTL
JSTL
 
JSP
JSPJSP
JSP
 
JDBC
JDBCJDBC
JDBC
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 

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

  • 2. OutOfMemoryError Все java - разработчики, рано или поздно, встречаются с пресловутой ошибкой OutOfMemoryError. После этой встречи мы начинаем более бережно относится к используемой памяти и экономить ее.
  • 3. Ссылки в Java Жёсткая (strong) ссылка. StringBuffer buffer = new StringBuffer(); Если объект доступен через цепочку ссылок (как например объект, на который ссылается переменная buffer), то такая ссылка называется жёсткой и сборщик мусора не станет уничтожать такой объект.
  • 4. Ссылки в Java Strongly reachable (прямо доступный) – к такому объекту можно получить доступ только посредством прямой ссылки.
  • 5. Ссылки в Java Softly reachable (мягко доступный) – к такому объекту нельзя получить доступ через прямую ссылку, он может быть доступен только посредством SoftReference. Weakly reachable (слабо доступный) – не может быть доступным через прямую и SoftReference ссылки. К такому объекту можно обратиться лишь посредством WeakReference.
  • 6. Ссылки в Java Phantomly reachable (фантомно дотупный) – объект соответственно не может быть доступен посредством 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. Резюме Эффективность использования этих классов также в значительной степени зависит от правильности выбранного способа для программирования их работы; крайне важно понять как работают данные классы для того чтобы правильно работать с ними.