SlideShare a Scribd company logo
Сборшик муссора. (GC)
Виталий Унгурян
unguryan@itstep.org
Класс Object
Класс Object - это базовый класс
для всех остальных объектов.
В Java каждый класс неявно
наследуется от класса Object.
Соответственно все классы наследуют
методы класса Object.
Метод equals
public boolean equals(Object obj) -
служит для сравнения объектов по
значению, а не по ссылке.
Сравнивается состояние объекта, у
которого вызывается этот метод, с
передаваемым аргументом.
public boolean equals(Object object) {
return (this == object);
}
Методы класса Object
public String toString() - Этот метод
позволяет получить текстовое описание
любого объекта. Создавая новый класс,
данный метод можно переопределить и
возвращать более подробное описание.
return getClass().getName() + "@" +
Integer.toHexString(hashCode());
Методы класса Object
public final native Class getClass()
-Этот метод возвращает объект класса
Class, который описывает класс(имя,
методы, поля), от которого был
порожден этот объект.
public native int hashCode() - данный
метод возвращает значение int. Цель
hashCode() – представить любой объект
целым числом.
Метод clone
protected native Object clone() throws
CloneNotSupportedException-
При выполнении метода clone()сначала
проверяется, можно ли клонировать
исходный объект. Если разработчик
хочет сделать объекты своего класса
доступными для клонирования через
Object.clone(), то он должен
реализовать в своем классе интерфейс
Cloneable.
Методы класса Object
Методы wait(), notify(), notifyAll()
используются для поддержки
многопоточности.
protected void finalize() throws
Throwable - данный метод вызывается
при уничтожении объекта
автоматическим сборщиком мусора
(garbage collector).
Анатомия объекта Java
Когда Java-код использует оператор
new для создания экземпляра объекта
Java, выделяется намного больше
данных, чем следовало бы ожидать.
Анатомия объекта Java
Например, соотношение размеров
между значением типа int и объектом
Integer— самым малым объектом,
который может содержать значение int,
— обычно составляет 1:4.
Накладные расходы приходятся на
метаданные, которые JVM использует для
описания объекта Java, в данном случае
Integer.
Метаданные
Class: указатель на сведения о классе, который
описывает тип объекта. В случае объекта
java.lang.Integer, например, это указатель на класс
java.lang.Integer;
флаги: набор флагов, которые описывают
состояние объекта, включая хэш-код для объекта,
если он есть, и форму объекта (то есть является
ли объект массивом);
Lock: сведения о синхронизации объекта — то
есть синхронизирован ли объект в настоящее
время.
Данные объекта
За метаданными объекта следуют
собственно данные объекта, состоящие
из полей, хранящихся в экземпляре
объекта. В случае объекта
java.lang.Integer это одно значение типа
int.
Макет String
Макет объекта java.lang.String для 32-
разрядного
32-разрядные и 64-разрядные
объекты Java
Сборка муссора
В программировании сборка мусора
(устоявшийся термин, с точки зрения
русского языка правильнее «сбор
мусора», англ.
garbage collection, GC)
— одна из форм
автоматического
управления памятью.
Сборщик мусора
Специальный процесс, называемый
сборщиком мусора (англ. garbage
collector), периодически освобождает
память, удаляя объекты, которые уже
не будут востребованы приложениями.
Принцип работы GC
Существует множество
алгоритмов, которыми может
воспользоваться JVM для
проведения garbage collection.
Можно указать, какие из них
будут использоваться JVM с
помощью параметров.
Размер кучи
Начальный размер кучи — это соотношение 1/64
физической памяти к 1 Гб.
 Максимальный размер кучи — это
соотношение 1/4 физической памяти до 1 Гб.
Тем не менее, алгоритмы выделения могут
варьироваться в разных VM.
Старые и молодые объекты
В динамической памяти приложения некоторые
объекты становятся мусором вскоре после
создания, некоторые живут в течение долгого
времени и только затем становятся мусором,
другие могут остаться в живых в течение всего
времени работы программы. Эмпирические
исследования показали, что в большинстве
объектно-ориентированных языков, включая
Java, огромное количество объектов,
приблизительно 98 % умирают молодыми.
Деление кучи
Eden Space (heap): область, в которой
размещается большинство вновь
созданных объектов.
Survivor Space (heap): область, которая
содержит объекты, которые "выжили" после
очистки мусора в области Eden Space.
Tenured Generation (heap): содержит
объекты, которые существовали некоторое
время в Survivor Space.
Java memory model
Распределение памяти
Распределение памяти
Heap – основной сегмент памяти,
где хранятся все объекты.
Вне кучи
Permanent Generation (non-heap) –
Здесь хранится метаинформация,
используемая JVM (используемые
классы, методы и т.п.).
В частноси Code Cache (non-heap) —
эта область используется JVM, когда
включена JIT-компиляция, в ней
кешируется скомпилированный
платформенно — зависимый код.
Разница между Stack и Heap памятью в
Java
Куча используется всеми
частями приложения в то время
как стек используется только
одним потоком исполнения
программы.
Разница между Stack и Heap памятью в
Java
Всякий раз, когда создаётся объект,
он всегда хранится в куче, а в
памяти стека содержится ссылка на
него. Память стека содержит
только локальные переменные
примитивных типов и ссылки на
объекты в куче.
Разница между Stack и Heap памятью в
Java
Объекты в куче доступны с
любой точки программы, в то
время как стековая память
доступна только для одного
потока.
Разница между Stack и Heap памятью в
Java
Стековая память существует
лишь какое-то время работы
программы, а память в куче
живёт с самого начала до
конца работы программы.
Разница между Stack и Heap памятью в
Java
Размер памяти стека намного меньше
памяти в куче. Из-за простоты
распределения памяти (LIFO), стековая
память работает намного быстрее кучи.
java.lang.OutOfMemoryError:
Java heap space
Не хватает место в куче, а именно, в
области памяти в которую помещаются
объекты, создаваемые программно в
вашем приложении. Размер задаётся
параметрами -Xms и -Xmx. Если вы
пытаетесь создать объект, а места в
куче не осталось, то получаете эту
ошибку.
java.lang.OutOfMemoryError:
PermGen space
Данная ошибка возникает при нехватке
места в Permanent области, размер
которой задается параметрами
-XX:PermSize и -XX:MaxPermSize.
Метаданные об объектах
С точки зрения java в этой области лежат
те же объекты, что и в основной куче.
Только это объекты определенных типов,
а именно Class, Method, Field и Constructor.
java.lang.OutOfMemoryError: GC
overhead limit exceeded
Данная ошибка может возникнуть как
при переполнении первой, так и второй
областей. Связана она с тем, что
памяти осталось мало и GC постоянно
работает, пытаясь высвободить
немного места. Данную ошибку можно
отключить с помощью параметра -XX:-
UseGCOverheadLimit
java.lang.OutOfMemoryError: unable to
create new native thread
Допустим у вас есть приложение с большим
количеством одновременно работающих
пользователей, которое запускается с
параметрами -Xmx1024M
-XX:MaxPermSize=256M -Xss512K. Если всего
процессу доступно 2G, то остаётся
свободным ещё около 768M. Именно в
данном остатке памяти и создаются стеки
потоков. Таким образом, примерно вы можете
создать не больше 768*(1024/512)=1536.
Размещение в памяти
При создании объекта, когда вы пишете
что-то типа byte[] data = new byte[1024],
этот объект создаётся в сегменте Eden.
Новые объекты всегда размешаются в
Eden. Когда вы хотите создать новый
объект, но места в Eden уже нет, JVM
проводит сборку муссора (JVM ищет в
памяти все объекты, которые более не
нужны, и избавляется от них).
Стратегии сборки мусора
Как только определено множество
недостижимых объектов, сборщик
мусора может освободить память,
занимаемую ими, и оставить все
остальное как есть.
Стратегии сборки мусора
Также можно после освобождения
памяти переместить все или часть
оставшихся объектов в другие области
памяти, обновив вместе с этим все
ссылки на них. Эти два варианта
реализации называются,
соответственно, не перемещающим и
перемещающим.
Copy Collection
На первом этапе Mark помечаются
неиспользуемые объекты (красные).
На втором (Copy) объекты, которые ещё
нужны (d) копируется в сегмент survivor
– квадрат справа.
Сегментов Survivor два,
и они меньше Eden.
Copy Collection
Теперь все объекты, которые мы хотим,
чтобы они были сохранены,
скопированы в Survivor, и JVM просто
удаляет всё из Eden. На этом всё. Этот
алгоритм создаёт кое-что, что
называется моментом,
«когда мир остановился».
Mark and Sweep
 Объекты распределяются в памяти
 Нужно запустить GC
 Приложение приостанавливается
 Сборщик проходится по дереву объектов,
помечая живые объекты
 Сборщик проходится по всей памяти, находя все
не отмеченные куски памяти, сохраняя их в "free list"
 Когда новые объекты начинают распределятся
они распределяются в память доступную в "free list"
Mark and Sweep
Mark-Sweep-Compact Collection
1. Mark»: помечаются неиспользуемые объекты
(красные).
2. «Sweep»: эти объекты удаляются из памяти.
Обратите внимание на пустые слоты на
диаграмме.
3. «Compact»: объекты
размещаются, занимая
свободные слоты,
что освобождает пространство
на тот случай, если потребуется
создать «большой» объект.
Алгоритм подсчёта ссылок
Использование алгоритма замедляет
операции присваивания ссылок, но зато
определение достижимых объектов
тривиально — это все объекты, значение
счётчика ссылок которых превышает нуль.
Без дополнительных уточнений этот
алгоритм, в отличие от предыдущего, не
удаляет циклически замкнутые цепочки
вышедших из употребления объектов,
сохранивших ссылки друг на друга.
Финализаторы
Финализатор указывает, что делать, когда
объект попадает под сборщик мусора.
Финализатор — это метод класса, который
автоматически вызывается средой
исполнения в промежутке времени между
моментом, когда объект этого класса
опознаётся сборщиком мусора как
неиспользуемый, и моментом удаления
объекта (освобождения занимаемой им
памяти).
Финализаторы
Финализатор для конкретного
объекта всегда выполняется после
того, как программа прекращает
использовать данный объект и до
того, как занимаемая объектом
память будет освобождена
сборщиком мусора.
Метод finalize
@Override
protected void finalize ( ) {
// здесь должен находиться код
финализации
}
Пакет JDK содержит и многочисленные
возможности для настройки сборки мусора.
Вы можете провести значительное время,
настраивая эти опции и оценивая эффект,
поэтому до того как Вы попытаетесь
настроить сборщик мусора, тщательно
убедитесь, что Ваше приложение хорошо
оптимизировано и выстроено.
Настройка GC

More Related Content

What's hot

JVM Memory Management Details
JVM Memory Management DetailsJVM Memory Management Details
JVM Memory Management Details
Azul Systems Inc.
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans
Hitesh-Java
 
Understanding REST APIs in 5 Simple Steps
Understanding REST APIs in 5 Simple StepsUnderstanding REST APIs in 5 Simple Steps
Understanding REST APIs in 5 Simple Steps
Tessa Mero
 
java-Unit4 chap2- awt controls and layout managers of applet
java-Unit4 chap2- awt controls and layout managers of appletjava-Unit4 chap2- awt controls and layout managers of applet
java-Unit4 chap2- awt controls and layout managers of applet
raksharao
 
Garbage collection in .net (basic level)
Garbage collection in .net (basic level)Garbage collection in .net (basic level)
Garbage collection in .net (basic level)
Larry Nung
 
Js scope
Js scopeJs scope
Selenium Locators
Selenium LocatorsSelenium Locators
Selenium Locators
Satyam Pandey
 
Xml parsers
Xml parsersXml parsers
Xml parsers
Manav Prasad
 
Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...
Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...
Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...
Red Hat Developers
 
Collections Api - Java
Collections Api - JavaCollections Api - Java
Collections Api - Java
Drishti Bhalla
 
Java Collections Framework
Java Collections FrameworkJava Collections Framework
Java Collections Framework
Sony India Software Center
 
Java fundamentals
Java fundamentalsJava fundamentals
Java fundamentals
HCMUTE
 
Java applets
Java appletsJava applets
Java applets
Pihu Goel
 
Java Collections
Java CollectionsJava Collections
Java Collections
parag
 
AAC Room
AAC RoomAAC Room
AAC Room
선옥 장
 
Java8 features
Java8 featuresJava8 features
Java8 features
Elias Hasnat
 
Java String
Java StringJava String
Java String
Java2Blog
 
Presentation1
Presentation1Presentation1
Presentation1
Anand Grewal
 
Garbage collection
Garbage collectionGarbage collection
Garbage collection
Somya Bagai
 
How Hashmap works internally in java
How Hashmap works internally  in javaHow Hashmap works internally  in java
How Hashmap works internally in java
Ramakrishna Joshi
 

What's hot (20)

JVM Memory Management Details
JVM Memory Management DetailsJVM Memory Management Details
JVM Memory Management Details
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans
 
Understanding REST APIs in 5 Simple Steps
Understanding REST APIs in 5 Simple StepsUnderstanding REST APIs in 5 Simple Steps
Understanding REST APIs in 5 Simple Steps
 
java-Unit4 chap2- awt controls and layout managers of applet
java-Unit4 chap2- awt controls and layout managers of appletjava-Unit4 chap2- awt controls and layout managers of applet
java-Unit4 chap2- awt controls and layout managers of applet
 
Garbage collection in .net (basic level)
Garbage collection in .net (basic level)Garbage collection in .net (basic level)
Garbage collection in .net (basic level)
 
Js scope
Js scopeJs scope
Js scope
 
Selenium Locators
Selenium LocatorsSelenium Locators
Selenium Locators
 
Xml parsers
Xml parsersXml parsers
Xml parsers
 
Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...
Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...
Profile your Java apps in production on Red Hat OpenShift with Cryostat | Dev...
 
Collections Api - Java
Collections Api - JavaCollections Api - Java
Collections Api - Java
 
Java Collections Framework
Java Collections FrameworkJava Collections Framework
Java Collections Framework
 
Java fundamentals
Java fundamentalsJava fundamentals
Java fundamentals
 
Java applets
Java appletsJava applets
Java applets
 
Java Collections
Java CollectionsJava Collections
Java Collections
 
AAC Room
AAC RoomAAC Room
AAC Room
 
Java8 features
Java8 featuresJava8 features
Java8 features
 
Java String
Java StringJava String
Java String
 
Presentation1
Presentation1Presentation1
Presentation1
 
Garbage collection
Garbage collectionGarbage collection
Garbage collection
 
How Hashmap works internally in java
How Hashmap works internally  in javaHow Hashmap works internally  in java
How Hashmap works internally in java
 

Viewers also liked

Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
Unguryan Vitaliy
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
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. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
Unguryan Vitaliy
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
Unguryan Vitaliy
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
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
 
List - списки
List - списки List - списки
List - списки
Unguryan Vitaliy
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
Unguryan Vitaliy
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
Unguryan Vitaliy
 
Java. Введение в коллекции. Классы обертки. Перечисленияю
Java. Введение в коллекции. Классы обертки.  ПеречисленияюJava. Введение в коллекции. Классы обертки.  Перечисленияю
Java. Введение в коллекции. Классы обертки. Перечисленияю
Unguryan Vitaliy
 

Viewers also liked (20)

Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Uml
UmlUml
Uml
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
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. Вложенные классы и интерфейсы.
 
List - списки
List - списки List - списки
List - списки
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
 
Java. Введение в коллекции. Классы обертки. Перечисленияю
Java. Введение в коллекции. Классы обертки.  ПеречисленияюJava. Введение в коллекции. Классы обертки.  Перечисленияю
Java. Введение в коллекции. Классы обертки. Перечисленияю
 

Similar to Java. Сборщик мусора. Работа с памятью.

Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
Olexandra Dmytrenko
 
An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
Ecommerce Solution Provider SysIQ
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
DmitryTrushkin
 
Garbage collector
Garbage collectorGarbage collector
Garbage collector
DelphiCon
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
Ivan Krylov
 
Underscore js
Underscore jsUnderscore js
Underscore js
Olya Nosova
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
GetDev.NET
 
Msu.Center.Lectures.J02 Classes And Objects
Msu.Center.Lectures.J02 Classes And ObjectsMsu.Center.Lectures.J02 Classes And Objects
Msu.Center.Lectures.J02 Classes And Objectsolegol
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
OdessaJS Conf
 
Обзор Ruby
Обзор RubyОбзор Ruby
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaAndrei Pangin
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
Unguryan Vitaliy
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
Unguryan Vitaliy
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
Unguryan Vitaliy
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
Ivan Krylov
 

Similar to Java. Сборщик мусора. Работа с памятью. (20)

Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 
Garbage collector
Garbage collectorGarbage collector
Garbage collector
 
Лекция 6
Лекция 6Лекция 6
Лекция 6
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Underscore js
Underscore jsUnderscore js
Underscore js
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Msu.Center.Lectures.J02 Classes And Objects
Msu.Center.Lectures.J02 Classes And ObjectsMsu.Center.Lectures.J02 Classes And Objects
Msu.Center.Lectures.J02 Classes And Objects
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Step 7
Step 7Step 7
Step 7
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in Java
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 

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
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
Unguryan Vitaliy
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
Unguryan Vitaliy
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
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
 
XML
XMLXML
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
Unguryan Vitaliy
 
Аннотации в java
Аннотации в javaАннотации в java
Аннотации в java
Unguryan Vitaliy
 
java 8
java 8java 8

More from Unguryan Vitaliy (20)

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

Java. Сборщик мусора. Работа с памятью.

  • 1. Сборшик муссора. (GC) Виталий Унгурян unguryan@itstep.org
  • 2.
  • 3. Класс Object Класс Object - это базовый класс для всех остальных объектов. В Java каждый класс неявно наследуется от класса Object. Соответственно все классы наследуют методы класса Object.
  • 4. Метод equals public boolean equals(Object obj) - служит для сравнения объектов по значению, а не по ссылке. Сравнивается состояние объекта, у которого вызывается этот метод, с передаваемым аргументом. public boolean equals(Object object) { return (this == object); }
  • 5. Методы класса Object public String toString() - Этот метод позволяет получить текстовое описание любого объекта. Создавая новый класс, данный метод можно переопределить и возвращать более подробное описание. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  • 6. Методы класса Object public final native Class getClass() -Этот метод возвращает объект класса Class, который описывает класс(имя, методы, поля), от которого был порожден этот объект. public native int hashCode() - данный метод возвращает значение int. Цель hashCode() – представить любой объект целым числом.
  • 7. Метод clone protected native Object clone() throws CloneNotSupportedException- При выполнении метода clone()сначала проверяется, можно ли клонировать исходный объект. Если разработчик хочет сделать объекты своего класса доступными для клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable.
  • 8. Методы класса Object Методы wait(), notify(), notifyAll() используются для поддержки многопоточности. protected void finalize() throws Throwable - данный метод вызывается при уничтожении объекта автоматическим сборщиком мусора (garbage collector).
  • 9. Анатомия объекта Java Когда Java-код использует оператор new для создания экземпляра объекта Java, выделяется намного больше данных, чем следовало бы ожидать.
  • 10. Анатомия объекта Java Например, соотношение размеров между значением типа int и объектом Integer— самым малым объектом, который может содержать значение int, — обычно составляет 1:4. Накладные расходы приходятся на метаданные, которые JVM использует для описания объекта Java, в данном случае Integer.
  • 11. Метаданные Class: указатель на сведения о классе, который описывает тип объекта. В случае объекта java.lang.Integer, например, это указатель на класс java.lang.Integer; флаги: набор флагов, которые описывают состояние объекта, включая хэш-код для объекта, если он есть, и форму объекта (то есть является ли объект массивом); Lock: сведения о синхронизации объекта — то есть синхронизирован ли объект в настоящее время.
  • 12. Данные объекта За метаданными объекта следуют собственно данные объекта, состоящие из полей, хранящихся в экземпляре объекта. В случае объекта java.lang.Integer это одно значение типа int.
  • 13. Макет String Макет объекта java.lang.String для 32- разрядного
  • 15. Сборка муссора В программировании сборка мусора (устоявшийся термин, с точки зрения русского языка правильнее «сбор мусора», англ. garbage collection, GC) — одна из форм автоматического управления памятью.
  • 16. Сборщик мусора Специальный процесс, называемый сборщиком мусора (англ. garbage collector), периодически освобождает память, удаляя объекты, которые уже не будут востребованы приложениями.
  • 17. Принцип работы GC Существует множество алгоритмов, которыми может воспользоваться JVM для проведения garbage collection. Можно указать, какие из них будут использоваться JVM с помощью параметров.
  • 18. Размер кучи Начальный размер кучи — это соотношение 1/64 физической памяти к 1 Гб.  Максимальный размер кучи — это соотношение 1/4 физической памяти до 1 Гб. Тем не менее, алгоритмы выделения могут варьироваться в разных VM.
  • 19. Старые и молодые объекты В динамической памяти приложения некоторые объекты становятся мусором вскоре после создания, некоторые живут в течение долгого времени и только затем становятся мусором, другие могут остаться в живых в течение всего времени работы программы. Эмпирические исследования показали, что в большинстве объектно-ориентированных языков, включая Java, огромное количество объектов, приблизительно 98 % умирают молодыми.
  • 20.
  • 21. Деление кучи Eden Space (heap): область, в которой размещается большинство вновь созданных объектов. Survivor Space (heap): область, которая содержит объекты, которые "выжили" после очистки мусора в области Eden Space. Tenured Generation (heap): содержит объекты, которые существовали некоторое время в Survivor Space.
  • 24. Распределение памяти Heap – основной сегмент памяти, где хранятся все объекты.
  • 25. Вне кучи Permanent Generation (non-heap) – Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). В частноси Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно — зависимый код.
  • 26. Разница между Stack и Heap памятью в Java Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.
  • 27. Разница между Stack и Heap памятью в Java Всякий раз, когда создаётся объект, он всегда хранится в куче, а в памяти стека содержится ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
  • 28. Разница между Stack и Heap памятью в Java Объекты в куче доступны с любой точки программы, в то время как стековая память доступна только для одного потока.
  • 29. Разница между Stack и Heap памятью в Java Стековая память существует лишь какое-то время работы программы, а память в куче живёт с самого начала до конца работы программы.
  • 30. Разница между Stack и Heap памятью в Java Размер памяти стека намного меньше памяти в куче. Из-за простоты распределения памяти (LIFO), стековая память работает намного быстрее кучи.
  • 31. java.lang.OutOfMemoryError: Java heap space Не хватает место в куче, а именно, в области памяти в которую помещаются объекты, создаваемые программно в вашем приложении. Размер задаётся параметрами -Xms и -Xmx. Если вы пытаетесь создать объект, а места в куче не осталось, то получаете эту ошибку.
  • 32. java.lang.OutOfMemoryError: PermGen space Данная ошибка возникает при нехватке места в Permanent области, размер которой задается параметрами -XX:PermSize и -XX:MaxPermSize. Метаданные об объектах С точки зрения java в этой области лежат те же объекты, что и в основной куче. Только это объекты определенных типов, а именно Class, Method, Field и Constructor.
  • 33. java.lang.OutOfMemoryError: GC overhead limit exceeded Данная ошибка может возникнуть как при переполнении первой, так и второй областей. Связана она с тем, что памяти осталось мало и GC постоянно работает, пытаясь высвободить немного места. Данную ошибку можно отключить с помощью параметра -XX:- UseGCOverheadLimit
  • 34. java.lang.OutOfMemoryError: unable to create new native thread Допустим у вас есть приложение с большим количеством одновременно работающих пользователей, которое запускается с параметрами -Xmx1024M -XX:MaxPermSize=256M -Xss512K. Если всего процессу доступно 2G, то остаётся свободным ещё около 768M. Именно в данном остатке памяти и создаются стеки потоков. Таким образом, примерно вы можете создать не больше 768*(1024/512)=1536.
  • 35. Размещение в памяти При создании объекта, когда вы пишете что-то типа byte[] data = new byte[1024], этот объект создаётся в сегменте Eden. Новые объекты всегда размешаются в Eden. Когда вы хотите создать новый объект, но места в Eden уже нет, JVM проводит сборку муссора (JVM ищет в памяти все объекты, которые более не нужны, и избавляется от них).
  • 36. Стратегии сборки мусора Как только определено множество недостижимых объектов, сборщик мусора может освободить память, занимаемую ими, и оставить все остальное как есть.
  • 37. Стратегии сборки мусора Также можно после освобождения памяти переместить все или часть оставшихся объектов в другие области памяти, обновив вместе с этим все ссылки на них. Эти два варианта реализации называются, соответственно, не перемещающим и перемещающим.
  • 38. Copy Collection На первом этапе Mark помечаются неиспользуемые объекты (красные). На втором (Copy) объекты, которые ещё нужны (d) копируется в сегмент survivor – квадрат справа. Сегментов Survivor два, и они меньше Eden.
  • 39. Copy Collection Теперь все объекты, которые мы хотим, чтобы они были сохранены, скопированы в Survivor, и JVM просто удаляет всё из Eden. На этом всё. Этот алгоритм создаёт кое-что, что называется моментом, «когда мир остановился».
  • 40. Mark and Sweep  Объекты распределяются в памяти  Нужно запустить GC  Приложение приостанавливается  Сборщик проходится по дереву объектов, помечая живые объекты  Сборщик проходится по всей памяти, находя все не отмеченные куски памяти, сохраняя их в "free list"  Когда новые объекты начинают распределятся они распределяются в память доступную в "free list"
  • 42. Mark-Sweep-Compact Collection 1. Mark»: помечаются неиспользуемые объекты (красные). 2. «Sweep»: эти объекты удаляются из памяти. Обратите внимание на пустые слоты на диаграмме. 3. «Compact»: объекты размещаются, занимая свободные слоты, что освобождает пространство на тот случай, если потребуется создать «большой» объект.
  • 43. Алгоритм подсчёта ссылок Использование алгоритма замедляет операции присваивания ссылок, но зато определение достижимых объектов тривиально — это все объекты, значение счётчика ссылок которых превышает нуль. Без дополнительных уточнений этот алгоритм, в отличие от предыдущего, не удаляет циклически замкнутые цепочки вышедших из употребления объектов, сохранивших ссылки друг на друга.
  • 44. Финализаторы Финализатор указывает, что делать, когда объект попадает под сборщик мусора. Финализатор — это метод класса, который автоматически вызывается средой исполнения в промежутке времени между моментом, когда объект этого класса опознаётся сборщиком мусора как неиспользуемый, и моментом удаления объекта (освобождения занимаемой им памяти).
  • 45. Финализаторы Финализатор для конкретного объекта всегда выполняется после того, как программа прекращает использовать данный объект и до того, как занимаемая объектом память будет освобождена сборщиком мусора.
  • 46. Метод finalize @Override protected void finalize ( ) { // здесь должен находиться код финализации }
  • 47.
  • 48. Пакет JDK содержит и многочисленные возможности для настройки сборки мусора. Вы можете провести значительное время, настраивая эти опции и оценивая эффект, поэтому до того как Вы попытаетесь настроить сборщик мусора, тщательно убедитесь, что Ваше приложение хорошо оптимизировано и выстроено. Настройка GC