An Introduction to JVM Internals and Garbage Collection in JavaAbhishek Asthana
This document provides an overview of Java memory structures and garbage collection. It discusses the key areas of memory used by the JVM - heap, method area, native area, and threads. It then covers garbage collection concepts like roots, algorithms like mark-sweep-compact, and different GC strategies like serial, parallel, concurrent mark-sweep, and Garbage First collector. Performance metrics for evaluating GC and how objects transition between generations in generational collection are also summarized.
An Introduction to JVM Internals and Garbage Collection in JavaAbhishek Asthana
This document provides an overview of Java memory structures and garbage collection. It discusses the key areas of memory used by the JVM - heap, method area, native area, and threads. It then covers garbage collection concepts like roots, algorithms like mark-sweep-compact, and different GC strategies like serial, parallel, concurrent mark-sweep, and Garbage First collector. Performance metrics for evaluating GC and how objects transition between generations in generational collection are also summarized.
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. Резюме
Эффективность использования этих
классов также в значительной степени
зависит от правильности выбранного
способа для программирования их
работы; крайне важно понять как
работают данные классы для того
чтобы правильно работать с ними.