Similar presentations:
4_Java_memory_structure
1.
Java developeradvanced
Memory management.
JVM memory structure
otus.ru
2.
Меня хорошо видно& слышно?
Ставим “+”, если все хорошо “-”, если есть проблемы
3.
Memory management. JVMmemory structuree
Данилов Кирилл
Middle Java developer в ГК Иннотех
4 года опыта backend разработки на языке Java + Spring
kiril5471710@gmail.com
4.
Правила вебинараАктивно
участвуем
Off-topic обсуждаем
в учебной группе
#Java-developeradvanced
Задаем вопрос
в чат или голосом
Индивидуально
Время, необходимое
на активность
Пишем в чат
Говорим голосом
Документ
Вопросы вижу в чате,
могу ответить не сразу
Ответьте себе
или задайте
вопрос
5.
Маршрут вебинара1. Знакомство с JVM memory structure
2. Stack vs Heap
3. Работа сборщика мусора
4. Виды ссылок в Java
5. Описание ДЗ
6.
Цели вебинараК концу занятия вы сможете
1.
Рассказать из чего состоит память в Java
2.
Рассказать логику работы GC в Java
3.
Написать собственную реализацию кэша
7.
Кто знает из каких областей состоит память в Java?8.
JVM structure9.
JVM Memory StructureВ Java управление памятью — это процесс выделения и освобождения объектов,
называемый управлением памятью. Java управляет памятью автоматически. Java
использует автоматическую систему управления памятью, называемую сборщиком
мусора. Таким образом, нам не требуется реализовывать логику управления
памятью в нашем приложении. Управление памятью Java делится на две
основные части:JVM Memory Structure и Garbage Collector
10.
JVM Memory StructureJVM создает в куче различные области данных
времени выполнения. Эти области
используются во время выполнения программы.
Области памяти уничтожаются при выходе JVM,
тогда как области данных уничтожаются при
выходе из потока
11.
JVM Memory StructureMethod Area
Область метода — это часть динамической памяти, которая используется всеми потоками. Он создается при
запуске JVM. Он используется для хранения структуры класса, имени суперкласса, имени интерфейса и
конструкторов. JVM хранит в области метода следующие виды информации:
• Полное имя типа (например, String).
• Модификаторы типа
• Прямое имя суперкласса типа
• Структурированный список полных имен суперинтерфейсов
12.
JVM Memory StructureHeap Area
В куче хранятся реальные объекты. Он создается при запуске JVM.
При необходимости пользователь может управлять кучей. Он может
иметь фиксированный или динамический размер. Когда вы
используете новое ключевое слово, JVM создает экземпляр объекта
в куче. Пока ссылка на этот объект сохраняется в стеке. Для каждого
запущенного процесса JVM существует только одна куча. Когда куча
заполняется, мусор собирается. Например
StringBuilder sb = new StringBuilder();
Приведенный выше оператор создает объект класса StringBuilder.
Объект выделяется в куче, а ссылка sb выделяется в стек.
13.
JVM Memory StructureHeap Area
Куча разделена на следующие части:
• Young generation
• Survivor space
• Old generation
• Code Cache
1.Young Generation — область где размещаются недавно созданные объекты. Когда она заполняется,
происходит быстрая сборка мусора
2.Old (Tenured) Generation — здесь хранятся долгоживущие объекты. Когда объекты из Young
Generation достигают определенного порога «возраста», они перемещаются в Old Generation
3.Survival сегмент области heap'а используется JVM для хранения объектов, которые пережили один и
более проходов сборщика мусора.Survival сегмент представлен в JVM двумя сегментами - S0 и S1. Они
служат неким "перевалочным пунктом" для объектов на пути к Old Gen сегменту. В S0 и S1 сегментах
объекты могут провести какое-то время до тех пор, пока они не будут удалены из памяти или
переведены в Old Gen сегмент.
4.Кэш кода JVM — это область, где JVM хранит свой байт-код, скомпилированный в собственный код.
Мы называем каждый блок исполняемого машинного кода nметодом. nmethod может быть полным или
встроенным методом Java
14.
JVM Memory StructureHeap Area
Основные особенности кучи:
Когда эта область памяти полностью заполняется, Java бросает java.lang.OutOfMemoryError
Доступ к ней медленнее, чем к стеку
Эта память, в отличие от стека, автоматически не освобождается. Для сбора неиспользуемых
объектов используется сборщик мусора
В отличие от стека, куча не является потокобезопасной и ее необходимо контролировать, правильно
синхронизируя код
Пространство кучи является общим для всего приложения
Размер кучи не ограничен
Все созданные объекты хранятся в куче(включая строки в Java)
Доступ к этой памяти осуществляется с помощью сложных методов управления памятью, включая
Young Generation, Old Generation
Память в куче выделяется, когда создается новый объект и освобождается сборщиком мусора, когда
в приложении не остается ни одной ссылки на его
15.
JVM Memory StructureStack Area
Стек работает по схеме LIFO (последним вошел, первым вышел). Всякий раз, когда вызывается новый
метод, содержащий примитивные значения или ссылки на объекты, то на вершине стека под них
выделяется блок памяти. Из этого можно сделать вывод, что стек хранит значения примитивных
переменных, создаваемых в методах, а также ссылки на объекты в куче на которые ссылается метод.
Когда метод завершает выполнение, блок памяти (frame), отведенный для его нужд, очищается, и
пространство становится доступным для следующего метода. При этом поток выполнения программы
возвращается к месту вызова этого метода с последующим переходом к следующей строке кода.
16.
JVM Memory StructureStack Area
Основные особенности стека:
Память автоматически выделяется и освобождается, когда метод вызывается и завершается
соответственно
Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы
Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError
Доступ к этой области памяти осуществляется быстрее, чем к куче
Является потокобезопасным, поскольку для каждого потока создается свой отдельный стек
Работает по схеме последним вошел, первым вышел (LIFO)
Хранит примитивы и ссылки на объекты
Предел размера стека определен операционной системой
17.
JVM Memory StructureStack and Heap
18.
JVM Memory StructureMethod Area
Method Area (область методов) — это часть памяти, используемая виртуальной
машиной Java (JVM) для хранения информации о классах и методах. Она играет
важную роль в управлении памятью и выполнении программ. Вот основные
функции Method Area:
Хранение метаданных классов: Method Area хранит информацию о классах,
таких как имя класса, его модификаторы доступа, методы, поля и другие
метаданные.
Хранение статических переменных: Все статические переменные классов также
хранятся в Method Area. Это позволяет JVM управлять состоянием классов и их
экземпляров.
Хранение констант: Константы, определенные в классах, также размещаются в
этой области.
Поддержка загрузки классов: Когда класс загружается в JVM, его метаданные
помещаются в Method Area, что позволяет виртуальной машине получить доступ
к информации о классе во время выполнения.
Оптимизация работы методов: Некоторые реализации JVM могут использовать
Method Area для оптимизации выполнения методов, например, путем хранения
байт-кода скомпилированных методов.
Важно отметить, что в современных версиях JVM область методов может быть
реализована как часть кучи (heap), и ее размер может быть настроен с помощью
параметров запуска JVM. Это позволяет эффективно управлять памятью и
оптимизировать производительность приложений
19.
JVM Memory StructureNative method stack
В Java область памяти, называемая native method stack (стек нативных методов),
используется для хранения информации о вызовах нативных методов, которые
написаны на других языках программирования, таких как C или C++.
▎Основные характеристики native method stack:
1. Назначение:
- Native method stack используется для выполнения нативных методов, которые могут
взаимодействовать с системой на более низком уровне, чем стандартные Javaметоды.
- Эти методы могут выполнять операции, которые недоступны в Java, например,
работу с системными вызовами или манипуляцию с памятью.
2. Структура:
- Как и стек (stack), native method stack организован по принципу LIFO (Last In, First
Out). Это означает, что последний вызванный метод будет первым, который завершит
выполнение.
- Каждый поток в Java имеет свой собственный native method stack, который
изолирован от других потоков.
3. Параметры:
- Размер native method stack может быть настроен при запуске JVM с помощью
параметров командной строки, таких как -Xss. Это позволяет контролировать объем
памяти, выделяемой для стека.
4. Взаимодействие с Java:
- Нативные методы могут быть вызваны из Java-кода с использованием JNI (Java
Native Interface). Это позволяет Java-программам вызывать функции, написанные на
других языках.
- При вызове нативного метода информация о текущем состоянии выполнения
(например, локальные переменные и ссылки на объекты) передается из Java-стека в
native method stack.
5. Ошибки и исключения:
- Если происходит переполнение стека (stack overflow), это может привести к
ошибкам выполнения. Например, если нативный метод вызывает себя рекурсивно без
базового случая, это может привести к переполнению native method stack
20.
JVM Memory StructurePC Registers
PC Registers (счетчик программ) — это область памяти, содержащая
адрес выполняемой в данный момент инструкции JVM для каждого
потока. PC Registers помогает JVM отслеживать, какую инструкцию
выполнять следующей
Счетчик команд: Внутри JVM существует механизм, который
отслеживает текущую инструкцию, выполняемую в данный момент. Это
можно рассматривать как аналог PC register, так как он указывает на
адрес следующей инструкции в коде.
Управление потоком: JVM использует различные структуры данных и
механизмы для управления выполнением потоков, включая стек
вызовов, который также может содержать информацию о текущем
состоянии выполнения.
Оптимизация: Некоторые реализации JVM могут использовать
различные техники оптимизации, которые требуют отслеживания
текущего состояния выполнения программы, что также может быть
связано с концепцией регистров.
PC Registers (PC) — это область памяти, в которой хранится адрес
выполняемой в данный момент инструкции байт-кода Java для каждого
потока. PC Registers помогает управлять выполнением потоков и
поддерживать последовательность выполнения инструкций в JVM. Он
содержит адрес памяти следующей выполняемой инструкции байт-кода,
и его значение соответствующим образом обновляется по мере того, как
JVM обрабатывает инструкции байт-кода Java.
21.
Garbage Collector22.
Garbage CollectorЧто такое Garbage Collector ?
Сборка мусора, как оно тривиально не звучало бы, выполняется сборщиком мусора (Garbage Collector (GC)).
GC – часть JVM, прикладная программа, которая занимается очищением памяти.
Встает разумный вопрос: Как сборщик мусора понимает, какие объекты нужно удалить? Он смотрит на
достижимость объекта по ссылке. Это значит, что если мы не можем получить к нему доступ из программы, т.е. у
нас нет ссылки на него, то он помечается как мусор и будет удален при следующей сборке мусора.
Прежде чем удалить объект, нужно знать, где он находится. Давайте рассмотрим структуру памяти в Java.
Все объекты хранятся в куче (heap). Куча делится на поколения (generation). Есть всего два поколения: молодое
(young) и старое (old). Young generation состоит из eden и survivor space.
23.
Garbage CollectorСборка мусора
Сборка мусора происходит, когда заполнена вся область памяти. Память делится на два поколения,
поэтому есть два типа сборки мусора: minor GC и major GC. Первый происходит, когда переполняется young
generation, второй, когда переполняется область из old generation
1. Объект рождается. Во время исполнения JVM видит, что стоит оператор new. Происходит выделение
памяти под объект и возврат ссылки, которая будет ссылаться на занятый участок памяти. Все объекты
рождаются в eden
2. Объект рождается. Во время исполнения JVM видит, что
стоит оператор new. Происходит выделение памяти под объект и
возврат ссылки, которая будет ссылаться на занятый участок
памяти. Когда eden заполнен происходит minor GC
24.
Garbage CollectorСборка мусора
3. Объекты, у которых уже нет ссылки удаляются
4. Объекты, у которых есть ссылки попадают в survivor space из eden. Причем survivor space делиться
на две части. Между этими частями происходит перемещения объектов. В один момент времени
одна из частей пуста, чтоб мочь вместить объекты пришедшие из eden
25.
Garbage CollectorСборка мусора
5. Объекты, которые уже были в одной части survivor space, перемещаются в другую, при этом растет их
«возраст» (age). Сам процесс, перемещения объектов из различных частей survivor space и увеличения их
возраста называется «взрослением» (aging)
6.Объекты, которые достигли определенного возраста попадают в old generation. Этот процесс называется
«продвижением» promotion.
Этапы 1-6 происходят до тех пока не будет заполнен old generation, причем по ходу будут происходить
minor GC, для очищения young generation.
7.Когда old generation заполняется производиться major GC
8.Этапы 1-7 происходят на протяжении работы программы
26.
Garbage CollectorСборка мусора(Major GC или Full GC)
Major GC :
Old Generation предназначена для хранения долгоживущих объектов. Эта область больше по размеру по сравнению с Young
Generation. Major GC начинается с определения всех живых объектов в Old Generation. Все недоступные объекты удаляются. В отличие
от Minor GC, этот процесс может включать уплотнение, чтобы уменьшить фрагментацию памяти.Живые объекты могут быть
перемещены для уменьшения фрагментации памяти, обеспечивая эффективное использование памяти для новых объектов.Major GC
выполняется реже, но является более трудоемким, так как обрабатывает больший объем памяти. Во время Major GC, приложение
может испытывать более длительные паузы, так как это Stop-The-World процесс, где выполнение всех потоков приложения
приостанавливается.
Full Garbage Collection
Full Garbage Collection очищает всю кучу — как молодые, так и старые пространства. Многие путаются между Major (только OLD
поколение) и Full GC (Young + OLD (Heap)). Full Garbage Collection включает продвижение всех живых объектов от молодого до старого
поколения после сборки и уплотнения старого поколения. Полная сборка мусора будет остановкой для Stop-the-World. Она следит за
тем, чтобы новые объекты не выделялись и объекты не становились недоступными во время работы сборщика .
27.
Типы ссылок в Java28.
Garbage CollectorТипы ссылок
Существует четыре типа ссылок: сильная, слабая, мягкая и фантомная ссылка. Разница
между типами ссылок заключается в том, что объекты в куче, на которые они ссылаются,
подлежат сборке мусора по разным критериям.
Stronge Reference: самый простой тип ссылок, поскольку мы используем его в нашем ежедневном
программировании. Любой объект, к которому прикреплена сильная ссылка, не подлежит сборке мусора. Мы
можем создать сильную ссылку, используя следующий код:
StringBuilder sb = new StringBuilder();
Weak reference: Объекты, на которые ссылаются слабые ссылки, удаляются сразу, если на них нет
сильных или безопасных ссылок. Данный тип ссылок служит для реализации структур, для которых у
одного значения типа может быть только один объект, например пул строк, и объекты чаще всего
используется всего один раз, т.е. сохранили-получили-забыли. Она определена в
java.lang.ref.WeakReference. Мы можем создать слабую ссылку, используя следующий оператор:
WeakReference<StringBuilder> reference = new WeakReference<>(new StringBuilder());
29.
Garbage CollectorТипы ссылок
Soft Reference: она собирается, когда приложению не хватает памяти. Сборщик мусора не
собирает легкодоступные объекты. Все объекты с soft reference удаляются до того, как GC
выдаст OutOfMemoryError.Данный тип ссылок подходит для реализации кэша - такой структуры
данных, например, можно запоминать данные из файлов или тяжелых запросов. Мы можем
создать мягкую ссылку, используя следующий оператор
SoftReference<StringBuilder> reference = new SoftReference<>(new StringBuilder());
ReferenceQueue
Все типы ссылок, за исключением сильных, в Java являются наследниками класса Reference. Все его
наследники всегда попадают в ReferenceQueue, это может происходить явно (мы можем задать свою
очередь) или неявно (когда мы не задаем). В нее попадают ссылки тех объектов, которые уже
помечены на удаление.
Особенности ссылок WeakReference и PhantomReference связаны с применением очереди ссылок.
Что касается особенности WeakReference, так это то, что, когда на объект уже нет сильных или
безопасных ссылок, происходит за'null'ение слабой ссылки, как в примере выше.
Далее WeakReference будет помещена в очередь ReferenceQueue и мы можем, пока объект не удален
физически, получить его из этой очереди.
30.
Garbage CollectorТипы ссылок
private static void example3() throws InterruptedException {
Object object = new Object() {
@Override
protected void finalize() throws Throwable {
System.out.println("Removed");
}
};
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> weak = new WeakReference<>(object, queue);
object = null;
System.gc();
TimeUnit.SECONDS.sleep(3);
System.out.println("from link " + weak.get());
System.out.println("from queue " + queue.poll());
}
Если запустить эту программу, то мы увидим результат
Но если закомментируем System.gc(), то мы увидим, что в очереди еще нет ничего, т.к. само удаление
еще не произошло
31.
Garbage CollectorТипы ссылок
Phantom Reference:
Фантомный тип ссылок имеет две особенности:
1) Метод get() всегда возвращает null, поэтому доступ можно осуществить только через
ReferenceQueue
2) PhantomReference попадает в ReferenceQueue только после выполнения finalize(), что
значит мы еще имеем доступ к объекту некоторое время.
Данный тип ссылки используется для более гибкого управления удалением объектов,
минуя минусы finalize().Объект, который имеет только фантомную ссылку, указывающую на
него, может быть собран всякий раз, когда сборщик мусора захочет его собрать. Мы можем
создать фантомную ссылку, используя следующий оператор
PhantomReference<StringBuilder> reference = new PhantomReference<>(new StringBuilder());
32.
Вопросы для проверки1.Чем Java отличается от C/C++?
2.Чем отличается Stack от Heap в Java?
3. Какие области памяти внутри Heap вы знаете?
4.Какой тип ссылок лучше подойдет для реализации кэша?
33.
Вопросы?Ставим “+”,
если вопросы есть
Ставим “–”,
если вопросов нет
34.
ДЗ35.
Домашнее заданиеНаписать собственную имплементацию кеша с использованием
WeakReference & SoftReference
1.Создать структуру данных типа кеш. Кеш должен быть абстрактный. То есть необходимо, чтобы можно
было задать ключ получения объекта кеша, и, в случае если его нет в памяти, задать поведение загрузки этого
объекта в кеш:
- указать кэшируемую директорию
- загрузить содержимое файла в кэш
- получить содержимое файла из кэша
2.Создать программу, эмулирующую поведение данного кэша. Программа должна считывать текстовые
файлы из системы и выдавать текст при запросе имени файла. Если в кэше файла нет, кэш должен загрузить
себе данные. По умолчанию в кеше нет ни одного файла. Текстовые файлы должны лежать в одной директории.
Пример: Names.txt, Address.txt - файлы в системе. При запросе по ключу Names.txt - кеш должен вернуть
содержимое файла Names.txt.
3.Создать в папке cache/menu класс Emulator для работы с пользователем. Предоставить пользователю
возможности:
- указать кэшируемую директорию
- загрузить содержимое файла в кэш
- получить содержимое файла из кэша
36.
Следующий вебинарMemory management. Разбор
алгоритмов GC: SerialGC,
ParallelGC, CMS GC
Ссылка на вебинар
будет в ЛК за 15 минут
Материалы
к занятию в ЛК —
можно изучать
Обязательный
материал обозначен
красной лентой
37.
Заполните, пожалуйста,опрос о занятии
по ссылке в чате
38.
Спасибо за внимание!Приходите на следующие вебинары
Данилов Кирилл
Java developer в IW
group
Контакты
kiril5471710@gmail.com
programming