SlideShare uma empresa Scribd logo
1 de 48
Сборшик муссора. (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

Mais conteúdo relacionado

Mais procurados

5 collection framework
5 collection framework5 collection framework
5 collection frameworkMinal Maniar
 
L11 array list
L11 array listL11 array list
L11 array listteach4uin
 
JAVA Collections frame work ppt
 JAVA Collections frame work ppt JAVA Collections frame work ppt
JAVA Collections frame work pptRanjith Alappadan
 
ArrayList in JAVA
ArrayList in JAVAArrayList in JAVA
ArrayList in JAVASAGARDAVE29
 
Array vs array list
Array vs array listArray vs array list
Array vs array listRavi Shetye
 
Java collections concept
Java collections conceptJava collections concept
Java collections conceptkumar gaurav
 
Cloud Native Java GraalVM 이상과 현실
Cloud Native Java GraalVM 이상과 현실Cloud Native Java GraalVM 이상과 현실
Cloud Native Java GraalVM 이상과 현실Taewan Kim
 
Collections and its types in C# (with examples)
Collections and its types in C# (with examples)Collections and its types in C# (with examples)
Collections and its types in C# (with examples)Aijaz Ali Abro
 
Regular Expressions in Java
Regular Expressions in JavaRegular Expressions in Java
Regular Expressions in JavaOblivionWalker
 
Polymorphism in java
Polymorphism in javaPolymorphism in java
Polymorphism in javasureshraj43
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииUnguryan Vitaliy
 
Lecture 9 - DSA - Python Data Structures
Lecture 9 - DSA - Python Data StructuresLecture 9 - DSA - Python Data Structures
Lecture 9 - DSA - Python Data StructuresHaitham El-Ghareeb
 
Functional Programming
Functional ProgrammingFunctional Programming
Functional ProgrammingRyan Riley
 
Java Collections
Java CollectionsJava Collections
Java Collectionsparag
 

Mais procurados (20)

5 collection framework
5 collection framework5 collection framework
5 collection framework
 
L11 array list
L11 array listL11 array list
L11 array list
 
Java Collections
Java  Collections Java  Collections
Java Collections
 
JAVA Collections frame work ppt
 JAVA Collections frame work ppt JAVA Collections frame work ppt
JAVA Collections frame work ppt
 
Collections in Java Notes
Collections in Java NotesCollections in Java Notes
Collections in Java Notes
 
ArrayList in JAVA
ArrayList in JAVAArrayList in JAVA
ArrayList in JAVA
 
Array vs array list
Array vs array listArray vs array list
Array vs array list
 
Java 8 lambda
Java 8 lambdaJava 8 lambda
Java 8 lambda
 
Java collections concept
Java collections conceptJava collections concept
Java collections concept
 
Java Generics
Java GenericsJava Generics
Java Generics
 
Cloud Native Java GraalVM 이상과 현실
Cloud Native Java GraalVM 이상과 현실Cloud Native Java GraalVM 이상과 현실
Cloud Native Java GraalVM 이상과 현실
 
Collections and its types in C# (with examples)
Collections and its types in C# (with examples)Collections and its types in C# (with examples)
Collections and its types in C# (with examples)
 
Regular Expressions in Java
Regular Expressions in JavaRegular Expressions in Java
Regular Expressions in Java
 
Polymorphism in java
Polymorphism in javaPolymorphism in java
Polymorphism in java
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
Java Quiz
Java QuizJava Quiz
Java Quiz
 
Lecture 9 - DSA - Python Data Structures
Lecture 9 - DSA - Python Data StructuresLecture 9 - DSA - Python Data Structures
Lecture 9 - DSA - Python Data Structures
 
Functional Programming
Functional ProgrammingFunctional Programming
Functional Programming
 
Pointer in C
Pointer in CPointer in C
Pointer in C
 
Java Collections
Java CollectionsJava Collections
Java Collections
 

Destaque

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. Интерфейс 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
 
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 JavaAbhishek Asthana
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки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
 

Destaque (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 - шаблонные типы.
 
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. Введение в коллекции. Классы обертки. Перечисленияю
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 

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

Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Garbage collector
Garbage collectorGarbage collector
Garbage collectorDelphiCon
 
Лекция 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 modularizationIvan Krylov
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.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
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
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
Ввведение в javaUnguryan 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 versionIvan Krylov
 

Semelhante a 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
 

Mais de Unguryan Vitaliy

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование. Unguryan Vitaliy
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVCUnguryan Vitaliy
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектамиUnguryan Vitaliy
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версийUnguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Unguryan Vitaliy
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoFUnguryan Vitaliy
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernateUnguryan Vitaliy
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в SpringUnguryan Vitaliy
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSPUnguryan Vitaliy
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействиеUnguryan Vitaliy
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологииUnguryan Vitaliy
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в javaUnguryan Vitaliy
 

Mais de 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
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
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. Сборщик мусора. Работа с памятью.

  • 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