SlideShare a Scribd company logo
Оптимизация производительности: 
эффективное взаимодействие с виртуальной 
машиной 
December 12, 2014 www.ExigenServices.com
2 www.ExigenServices.com 
Цели тренинга 
 Узнать некоторые подробности устройства JVM 
вообще и HotSpot JVM в частности 
 Научиться писать код, который работает 
быстрее 
 Узнать об утилитах для работы с JVM
3 www.ExigenServices.com 
Содержание 
 Некоторые моменты архитектуры HotSpot 
JVM 
 Эффективное взаимодействие с JIT- 
компилятором 
 Эффективное взаимодействие со сборщиком 
мусора
4 www.ExigenServices.com 
Архитектура HotSpot JVM 
 Runtime 
 Загрузка классов… 
 Сборщик мусора 
 Интрепретатор 
 JIT 
 Клиентский 
 Серверный
5 www.ExigenServices.com 
Содержание 
 Архитектура HotSpot JVM 
 Эффективное взаимодействие с JIT- 
компилятором 
 Эффективное взаимодействие со сборщиком 
мусора
Эффективное взаимодействие с JIT- 
компилятором: типы компиляторов 
6 www.ExigenServices.com 
 client - 32bit 
- простой, ориентирован на приложения клиентского типа 
(апплеты, игры) 
- работает быстро, важна скорость запуска приложений 
- генерирует менее оптимальный код 
 server – 32bit, 64bit 
- сложный, ориентирован на приложения серверного типа 
- работает дольше, важна производительность создаваемого 
кода 
- более серьёзный анализ, сбор большей статистики => 
применение более агрессивных оптимизаций
Эффективное взаимодействие с JIT- 
компилятором: типы компиляторов 
7 www.ExigenServices.com 
 Машины серверного класса: 
 Памяти ≥ 2Gb 
 Количество cpu ≥ 2 
 Компилятор, выбираемый по умолчанию
Эффективное взаимодействие с JIT- 
компилятором: типы компиляторов 
8 www.ExigenServices.com 
Какой компилятор работает? 
 Используйте jinfo (Java SE 6) 
 Или вызовите 
 Или используйте java –version 
 Или просто поменяйте тип компилятора: 
● java –client MyClass.class 
● java –server MyClass.class
Эффективное взаимодействие с JIT- 
компилятором: escape-анализ 
9 www.ExigenServices.com 
Escape-анализ 
 Является частью серверного компилятора 
 Использует понятие непокидающего объекта. Объект О 
называется непокидающим для метода М, если: 
- объявлен внутри метода M 
- не является объектом класса Thread или производного от 
него 
- не имеет финализатора 
- не сохраняется в статическом поле класса или в поле 
покидающего объекта 
- не передается другому методу в качестве аргумента, если 
только достоверно не известно, что O не покидает и этот 
метод
Эффективное взаимодействие с JIT- 
компилятором: escape-анализ 
10 www.ExigenServices.com 
Объекты i1 и e1 являются непокидающими
Эффективное взаимодействие с JIT- 
компилятором: escape-анализ 
11 www.ExigenServices.com 
Возможные оптимизации: 
 Устранение блокировок на непокидающих 
объектах 
 Оптимизация ссылок на объекты 
 В ряде случаев – размещение объекта в 
стеке или регистрах, а не в куче
Эффективное взаимодействие с JIT- 
компилятором: синхронизация 
Синхронизация java-объектов 
 Операции захвата/освобождения объектов дорогие 
 В большинстве случаев захват объекта не является 
состязательным: 
- либо объект был свободным 
- либо произошёл рекурсивный захват в рамках потока 
Решение: 
 Использование легковесных блокировок (эквивалентов CAS - 
12 www.ExigenServices.com 
compare-and-swap – инструкций), это быстро 
 Использование тяжеловесных блокировок, если невозможно 
использовать легковесные – это на порядок медленнее
Эффективное взаимодействие с JIT- 
компилятором: синхронизация 
Использование CAS-инструкций может быть дорогим на 
13 www.ExigenServices.com 
многопроцессорных машинах 
 Решение – привязанные (biased) блокировки 
 Минус – дорогая операция отката привязки. JVM 
анализирует статистику откатов связывания и 
может запретит привязывания блокировки для 
определённых типов объектов 
 -XX: +UseBiasedLocking (начиная с 5.0 update 6)
Эффективное взаимодействие с JIT- 
компилятором 
 Пропуск блокировки (lock elision) 
- Избежание блокировки над локальными переменными 
14 www.ExigenServices.com 
- -XX: +DoEscapeAnalisys 
 Укрупнение блокировки(lock coarsening) 
- Объединение смежных synchronized блоков 
- -XX: +EliminateLocks
Эффективное взаимодействие с JIT- 
компилятором 
15 www.ExigenServices.com 
Советы по синхронизации: 
 Сразу рассчитывайте на использование вашего 
кода в многопоточных приложениях. 
Экономить на синхронизации нет смысла 
 Используйте средства обнаружения 
состязательных блокировок (например, jvmstat)
16 www.ExigenServices.com 
Содержание 
 Архитектура HotSpot JVM 
 Эффективное взаимодействие с JIT- 
компилятором 
 Эффективное взаимодействие со 
сборщиком мусора
Эффективное взаимодействие со 
сборщиком мусора: принципы работы 
17 www.ExigenServices.com 
Сборка мусора (GC) 
 Размещает объекты в памяти, находит и освобождает место, 
занимаемое ненужными объектами 
 Автоматическая и безопасная 
 Проще, если граф объектов «заморожен» (stop-the-world 
паузы) 
 Возможны различные подходы 
- С дефрагментацией или без 
- Разные алгоритмы 
- С разными типами аллокации (размещения объектов в 
памяти) – например, учитывая «близость» области памяти к 
процессору
Эффективное взаимодействие со 
сборщиком мусора: принципы работы 
18 www.ExigenServices.com 
Сборка мусора с поколениями 
 Молодые и старые объекты содержатся отдельно 
- В пространствах, называемых «поколениями» 
- Возможны различные алгоритмы для молодого и старого 
поколения 
- Есть ещё третье пространство - Permanent Generation, 
содержащее данные о загруженных классах, 
откомпилированные методы и т.д. 
 Слабая гипотеза о поколениях 
- Большинство объектов временные 
- Молодое поколение можно собирать отдельно от старого
Эффективное взаимодействие со 
сборщиком мусора: принципы работы 
19 www.ExigenServices.com 
Фоновая сборка мусора 
– Уменьшает влияние GC на приложение 
– Сборка мусора происходит одновременно с работой 
приложения 
– Если фоновый GC собирает только старшее поколение, нет 
необходимости отслеживать изменения в молодом 
поколении
Эффективное взаимодействие со 
сборщиком мусора: принципы работы 
20 www.ExigenServices.com 
 Последовательный / Serial GC 
– Молодое поколение – последовательный копирующий GC, 
старое – Mark-Sweep Compact 
– Отлично подходит для клиентских приложений, не 
требующих много памяти (≤ 200 Mb) 
– “stop-the-world” сборщик – длительные паузы при больших 
объёмах 
 Фоновый / Concurrent Mark-Sweep GC 
– Предназначен для избегания “stop-the-world” пауз 
– Приводит к увеличению нагрузки на процессор, снижая 
общую производительность
Эффективное взаимодействие со 
сборщиком мусора: принципы работы 
21 www.ExigenServices.com 
Как узнать про сборку мусора? 
 jmap, jmap –heap, jmap –histo 
 -verbose:gc 
 -XX: +PrintGC 
 -XX: +PrintGCDetails 
 -XX: PrintHeapAtGC 
 -XX: PrintGCTimeStamps 
 jconsole 
 jvisualVM 
 YourKit Profile
Эффективное взаимодействие со 
сборщиком мусора: jvisualvm 
22 www.ExigenServices.com
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
23 www.ExigenServices.com 
 Быстрая аллокация 
- Новый объект выделяется в молодом поколении 
- Не нужно отслеживать изменение ссылок 
- Гораздо быстрее, чем стандартные аллокаторы для С/С++ 
 Быстрое освобождение новых объектов 
- Сборка молодого поколения 
Совет: 
– Не бойтесь выделять маленькие объекты для 
промежуточных результатов 
– Избегайте бессмысленных аллокаций, они приводят к 
лишним вызовам GC
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
Также не стоит забывать про анализ 
локальности (escape analysis), поэтому: 
 Используйте неизменяемые маложивущие 
объекты вместо часто изменяемых 
долгоживущих объектов 
 Используйте простой код с большим 
количеством аллокаций вместо сложных 
контрукций с меньшим количеством 
аллокаций 
24 www.ExigenServices.com
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
25 www.ExigenServices.com 
 Большие объекты 
- Долго аллоцировать (если объект не помещается в 
молодом поколении) 
- Дорого инициализировать 
 Частая аллокация и освобождение объектов разных 
размеров приводит к фрагментации (для GC без 
дефрагментации или с частичной дефрагментацией) 
Поэтому избегайте использования больших объектов, 
но не в ущерб удобству
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
26 www.ExigenServices.com 
Non-Uniform Memory Access (NUMA) 
 Доступ к памяти ассиметричен 
– процессоры имеют разные задержки при доступе к различным участкам 
памяти 
- SPARC, Opteron, некоторые процессоры Intel 
 NUMA-аллокатор 
- Память под объект выделяется «ближе» к процессору, на котором 
выполняется аллоцирующий поток 
- Доступ к объектам быстрее из потока, в котором произведена 
аллокация 
 Включается явно: -XX: +UseNUMA 
 JDK6u2, для Solaris ≥ 9, в Linux (с Linux kernel 2.6.19 и glibc 
2.6.1)
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
27 www.ExigenServices.com 
Обнуление ссылок 
 Редко помогает GC 
- GC в состоянии определить, доступен ли объект 
- Делает код менее читаемым 
- Может породить скрытые ошибки 
 Исключения 
- Структуры, основанные на массивах (в этом 
случае мы сами управляет памятью) 
- Предотвращение утечки памяти, связанной с 
финализацией
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
28 www.ExigenServices.com 
Пулы объектов 
 Наследие старых VM с очень медленной скоростью аллокации 
 Необходимо помнить 
- GC с поколениями оптимизированы для работы с 
маложивущими неизменяемыми объектами 
- Локальные объекты могут быть оптимизированы 
 Неиспользуемые объекты в пулах 
- Лишняя работа для GC по сканированию/копированию 
- Не приносит пользы, если приложение их не использует
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
29 www.ExigenServices.com 
Исключения 
 Объекты, которые дорого инициализировать 
 Объекты, которые связаны с редкими 
ресурсами 
- Потоки 
- Соединение к БД
Эффективное взаимодействие со 
сборщиком мусора: аллокация 
30 www.ExigenServices.com 
 Излишняя аллокация 
 Правильная версия 
 Старайтесь реалистично оценивать размер структур данных
Эффективное взаимодействие со 
сборщиком мусора: System.gc() 
31 www.ExigenServices.com 
 Не используйте явных вызовов GC 
- GC обладает информацией о скорости аллокации, 
заполненности старшего поколения… 
- System.gc() может повредить производительности 
 Исключения 
- Вызов System.gc() в период явного бездействия 
системы 
 В HotSpot 
- System.gc() вызывает полный stop-the-world GC 
- -XX: +DisableExplicitGC позволяет игнорировать 
System.gc()
Эффективное взаимодействие со 
сборщиком мусора: финализация 
 Основное применение – освобождение 
системных ресурсов 
 Финализируемые объекты – все с непустым 
finalize() 
 Аллокация финализируемых объектов 
32 www.ExigenServices.com 
- Существенно медленнее 
- VM должна их отслеживать
Эффективное взаимодействие со 
сборщиком мусора: финализация 
Использование финализации для управления 
системными ресурсами 
 GC выполняет много работы по сопровождению 
объекта с непустым finalize() и перед тем, как этот 
объект будет финализирован 
 GC вызывается, когда заканчивается память 
 Памяти обычно больше, чем других системных 
ресурсов 
Поэтому управляйте ресурсами явно – используйте 
33 www.ExigenServices.com 
пулы
Эффективное взаимодействие со 
сборщиком мусора: утечка памяти 
Утечка памяти в системах со сборкой мусора 
вызывается 
– Объектами, которые доступны, но не 
используются 
– Использованием механизмов финализации 
(временная утечка) 
34 www.ExigenServices.com
Эффективное взаимодействие со 
сборщиком мусора: утечка памяти 
35 www.ExigenServices.com 
Стандартные случаи утечки памяти 
 Забытые обработчики событий в Swing, AWT и т.д. 
 Исключения могут менять порядок выполнения
Эффективное взаимодействие со 
сборщиком мусора: утечка памяти 
36 www.ExigenServices.com 
Обнаружение утечек памяти 
 jconsole 
 jstat 
 VisualVM 
 jmap 
 -XX: PrintClassHistogram и Ctrl + Break
37 www.ExigenServices.com 
Полезные ссылки 
 Список опций JVM 
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp- 
140102.html 
 Этот тренинг подготовлен на основе доклада Екатерины 
Павловой «Оптимизация производительности: эффективная 
работа с виртуальной машиной» 
http://conference.javatalks.ru/data/JVMTalk.pdf 
 Блоги по этим и многим другим вопросам 
http://javablogs.com
38 www.ExigenServices.com 
Вопросы

More Related Content

PPTX
Performance optimization: effective interaction with virtual machine
PPTX
Expert Java Day: Java concurrency
PDF
2012 03 14_parallel_programming_lecture05
PPTX
Применение фреймворка GStreamer в системе видеонаблюдения
PPTX
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
PDF
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
PPTX
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
PDF
ZFS - файловая система будущего
Performance optimization: effective interaction with virtual machine
Expert Java Day: Java concurrency
2012 03 14_parallel_programming_lecture05
Применение фреймворка GStreamer в системе видеонаблюдения
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
ZFS - файловая система будущего

What's hot (14)

PDF
Build your own multistack JS startup
PPTX
Working with .NET Threads
PDF
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
PPT
Секреты сборки мусора в Java
PDF
Сборка мусора в .NET
PDF
Константин Осипов
PPTX
Dz Java Hi Load 0.4
PDF
Linuxvirt seminar-csc-2015
PPT
Секреты сборки мусора в Java (Алексей Рагозин)
PDF
PostgreSQL Vacuum: Nine Circles of Hell
PDF
20140310 parallel programming_kalishenko_lecture03-04
PDF
Другая виртуализация
PDF
"Производительность MySQL: что нового?"
PDF
Linux Terminal Server Project
Build your own multistack JS startup
Working with .NET Threads
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
Секреты сборки мусора в Java
Сборка мусора в .NET
Константин Осипов
Dz Java Hi Load 0.4
Linuxvirt seminar-csc-2015
Секреты сборки мусора в Java (Алексей Рагозин)
PostgreSQL Vacuum: Nine Circles of Hell
20140310 parallel programming_kalishenko_lecture03-04
Другая виртуализация
"Производительность MySQL: что нового?"
Linux Terminal Server Project
Ad

Viewers also liked (9)

PPTX
Quick Start to AngularJS
PPTX
Effective Feedback
PPTX
Lean Software Development
PPTX
Database versioning with liquibase
PPT
Unit Tests? It is Very Simple and Easy!
PPTX
English for Negotiations 2016
PPT
презентация
PPTX
Conflicts Resolving
KEY
Курс молодого бойца Keynote и Powerpoint
Quick Start to AngularJS
Effective Feedback
Lean Software Development
Database versioning with liquibase
Unit Tests? It is Very Simple and Easy!
English for Negotiations 2016
презентация
Conflicts Resolving
Курс молодого бойца Keynote и Powerpoint
Ad

Similar to Performance optimization effective interaction with virtual machine (20)

PPTX
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
PPTX
2014.12.23 Александр Андреев, Parallels
PDF
WebAssembly
PDF
Разница в подходах анализа кода компилятором и выделенным инструментом
PDF
IT-инфраструктура. FAQ для разработчика
PPTX
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
PDF
Desktop app based on node js and html5
ODP
Java 9 - кратко о новом
PDF
IForum 2016: Никита Семенов. Серьезный подход к серьезным проектам
PDF
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
PDF
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
PDF
Mihail Zachepilo - WebAssembly powered Machine Learning
PDF
Mihail Zachepilo - WebAssembly powered Machine Learning
PDF
Multithreading in JS. Myth or reality?
PDF
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
PDF
PDF
Lviv PMDay 2016 S Микита Семенов: Як привести великий проект до успіху? Від і...
PPTX
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
PPTX
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
PDF
Java 9: what is there beyond modularization
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
2014.12.23 Александр Андреев, Parallels
WebAssembly
Разница в подходах анализа кода компилятором и выделенным инструментом
IT-инфраструктура. FAQ для разработчика
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
Desktop app based on node js and html5
Java 9 - кратко о новом
IForum 2016: Никита Семенов. Серьезный подход к серьезным проектам
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
Multithreading in JS. Myth or reality?
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Lviv PMDay 2016 S Микита Семенов: Як привести великий проект до успіху? Від і...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Как жить в облаке почти без админов: мониторинг и эксплуатация сотен виртуаль...
Java 9: what is there beyond modularization

More from Return on Intelligence (20)

PPTX
Clean Code Approach
PPTX
Code Coverage
PPTX
Effective Communication in english
PPTX
Anti-patterns
PPTX
Introduction to Backbone.js & Marionette.js
PPTX
Types of testing and their classification
PPTX
Introduction to EJB
PPTX
Enterprise Service Bus
PPTX
Apache cassandra - future without boundaries (part3)
PPTX
Apache cassandra - future without boundaries (part2)
PPTX
Apache cassandra - future without boundaries (part1)
PPTX
Career development in exigen services
PPTX
Introduction to selenium web driver
PPTX
Enterprise service bus part 2
PPT
Enterprise service bus part 1
PPTX
Apache maven 2. advanced topics
PPTX
Apache maven 2 overview
PPT
Jira as a test management tool
PPTX
Testing your code
PPT
Quality Principles
Clean Code Approach
Code Coverage
Effective Communication in english
Anti-patterns
Introduction to Backbone.js & Marionette.js
Types of testing and their classification
Introduction to EJB
Enterprise Service Bus
Apache cassandra - future without boundaries (part3)
Apache cassandra - future without boundaries (part2)
Apache cassandra - future without boundaries (part1)
Career development in exigen services
Introduction to selenium web driver
Enterprise service bus part 2
Enterprise service bus part 1
Apache maven 2. advanced topics
Apache maven 2 overview
Jira as a test management tool
Testing your code
Quality Principles

Performance optimization effective interaction with virtual machine

  • 1. Оптимизация производительности: эффективное взаимодействие с виртуальной машиной December 12, 2014 www.ExigenServices.com
  • 2. 2 www.ExigenServices.com Цели тренинга  Узнать некоторые подробности устройства JVM вообще и HotSpot JVM в частности  Научиться писать код, который работает быстрее  Узнать об утилитах для работы с JVM
  • 3. 3 www.ExigenServices.com Содержание  Некоторые моменты архитектуры HotSpot JVM  Эффективное взаимодействие с JIT- компилятором  Эффективное взаимодействие со сборщиком мусора
  • 4. 4 www.ExigenServices.com Архитектура HotSpot JVM  Runtime  Загрузка классов…  Сборщик мусора  Интрепретатор  JIT  Клиентский  Серверный
  • 5. 5 www.ExigenServices.com Содержание  Архитектура HotSpot JVM  Эффективное взаимодействие с JIT- компилятором  Эффективное взаимодействие со сборщиком мусора
  • 6. Эффективное взаимодействие с JIT- компилятором: типы компиляторов 6 www.ExigenServices.com  client - 32bit - простой, ориентирован на приложения клиентского типа (апплеты, игры) - работает быстро, важна скорость запуска приложений - генерирует менее оптимальный код  server – 32bit, 64bit - сложный, ориентирован на приложения серверного типа - работает дольше, важна производительность создаваемого кода - более серьёзный анализ, сбор большей статистики => применение более агрессивных оптимизаций
  • 7. Эффективное взаимодействие с JIT- компилятором: типы компиляторов 7 www.ExigenServices.com  Машины серверного класса:  Памяти ≥ 2Gb  Количество cpu ≥ 2  Компилятор, выбираемый по умолчанию
  • 8. Эффективное взаимодействие с JIT- компилятором: типы компиляторов 8 www.ExigenServices.com Какой компилятор работает?  Используйте jinfo (Java SE 6)  Или вызовите  Или используйте java –version  Или просто поменяйте тип компилятора: ● java –client MyClass.class ● java –server MyClass.class
  • 9. Эффективное взаимодействие с JIT- компилятором: escape-анализ 9 www.ExigenServices.com Escape-анализ  Является частью серверного компилятора  Использует понятие непокидающего объекта. Объект О называется непокидающим для метода М, если: - объявлен внутри метода M - не является объектом класса Thread или производного от него - не имеет финализатора - не сохраняется в статическом поле класса или в поле покидающего объекта - не передается другому методу в качестве аргумента, если только достоверно не известно, что O не покидает и этот метод
  • 10. Эффективное взаимодействие с JIT- компилятором: escape-анализ 10 www.ExigenServices.com Объекты i1 и e1 являются непокидающими
  • 11. Эффективное взаимодействие с JIT- компилятором: escape-анализ 11 www.ExigenServices.com Возможные оптимизации:  Устранение блокировок на непокидающих объектах  Оптимизация ссылок на объекты  В ряде случаев – размещение объекта в стеке или регистрах, а не в куче
  • 12. Эффективное взаимодействие с JIT- компилятором: синхронизация Синхронизация java-объектов  Операции захвата/освобождения объектов дорогие  В большинстве случаев захват объекта не является состязательным: - либо объект был свободным - либо произошёл рекурсивный захват в рамках потока Решение:  Использование легковесных блокировок (эквивалентов CAS - 12 www.ExigenServices.com compare-and-swap – инструкций), это быстро  Использование тяжеловесных блокировок, если невозможно использовать легковесные – это на порядок медленнее
  • 13. Эффективное взаимодействие с JIT- компилятором: синхронизация Использование CAS-инструкций может быть дорогим на 13 www.ExigenServices.com многопроцессорных машинах  Решение – привязанные (biased) блокировки  Минус – дорогая операция отката привязки. JVM анализирует статистику откатов связывания и может запретит привязывания блокировки для определённых типов объектов  -XX: +UseBiasedLocking (начиная с 5.0 update 6)
  • 14. Эффективное взаимодействие с JIT- компилятором  Пропуск блокировки (lock elision) - Избежание блокировки над локальными переменными 14 www.ExigenServices.com - -XX: +DoEscapeAnalisys  Укрупнение блокировки(lock coarsening) - Объединение смежных synchronized блоков - -XX: +EliminateLocks
  • 15. Эффективное взаимодействие с JIT- компилятором 15 www.ExigenServices.com Советы по синхронизации:  Сразу рассчитывайте на использование вашего кода в многопоточных приложениях. Экономить на синхронизации нет смысла  Используйте средства обнаружения состязательных блокировок (например, jvmstat)
  • 16. 16 www.ExigenServices.com Содержание  Архитектура HotSpot JVM  Эффективное взаимодействие с JIT- компилятором  Эффективное взаимодействие со сборщиком мусора
  • 17. Эффективное взаимодействие со сборщиком мусора: принципы работы 17 www.ExigenServices.com Сборка мусора (GC)  Размещает объекты в памяти, находит и освобождает место, занимаемое ненужными объектами  Автоматическая и безопасная  Проще, если граф объектов «заморожен» (stop-the-world паузы)  Возможны различные подходы - С дефрагментацией или без - Разные алгоритмы - С разными типами аллокации (размещения объектов в памяти) – например, учитывая «близость» области памяти к процессору
  • 18. Эффективное взаимодействие со сборщиком мусора: принципы работы 18 www.ExigenServices.com Сборка мусора с поколениями  Молодые и старые объекты содержатся отдельно - В пространствах, называемых «поколениями» - Возможны различные алгоритмы для молодого и старого поколения - Есть ещё третье пространство - Permanent Generation, содержащее данные о загруженных классах, откомпилированные методы и т.д.  Слабая гипотеза о поколениях - Большинство объектов временные - Молодое поколение можно собирать отдельно от старого
  • 19. Эффективное взаимодействие со сборщиком мусора: принципы работы 19 www.ExigenServices.com Фоновая сборка мусора – Уменьшает влияние GC на приложение – Сборка мусора происходит одновременно с работой приложения – Если фоновый GC собирает только старшее поколение, нет необходимости отслеживать изменения в молодом поколении
  • 20. Эффективное взаимодействие со сборщиком мусора: принципы работы 20 www.ExigenServices.com  Последовательный / Serial GC – Молодое поколение – последовательный копирующий GC, старое – Mark-Sweep Compact – Отлично подходит для клиентских приложений, не требующих много памяти (≤ 200 Mb) – “stop-the-world” сборщик – длительные паузы при больших объёмах  Фоновый / Concurrent Mark-Sweep GC – Предназначен для избегания “stop-the-world” пауз – Приводит к увеличению нагрузки на процессор, снижая общую производительность
  • 21. Эффективное взаимодействие со сборщиком мусора: принципы работы 21 www.ExigenServices.com Как узнать про сборку мусора?  jmap, jmap –heap, jmap –histo  -verbose:gc  -XX: +PrintGC  -XX: +PrintGCDetails  -XX: PrintHeapAtGC  -XX: PrintGCTimeStamps  jconsole  jvisualVM  YourKit Profile
  • 22. Эффективное взаимодействие со сборщиком мусора: jvisualvm 22 www.ExigenServices.com
  • 23. Эффективное взаимодействие со сборщиком мусора: аллокация 23 www.ExigenServices.com  Быстрая аллокация - Новый объект выделяется в молодом поколении - Не нужно отслеживать изменение ссылок - Гораздо быстрее, чем стандартные аллокаторы для С/С++  Быстрое освобождение новых объектов - Сборка молодого поколения Совет: – Не бойтесь выделять маленькие объекты для промежуточных результатов – Избегайте бессмысленных аллокаций, они приводят к лишним вызовам GC
  • 24. Эффективное взаимодействие со сборщиком мусора: аллокация Также не стоит забывать про анализ локальности (escape analysis), поэтому:  Используйте неизменяемые маложивущие объекты вместо часто изменяемых долгоживущих объектов  Используйте простой код с большим количеством аллокаций вместо сложных контрукций с меньшим количеством аллокаций 24 www.ExigenServices.com
  • 25. Эффективное взаимодействие со сборщиком мусора: аллокация 25 www.ExigenServices.com  Большие объекты - Долго аллоцировать (если объект не помещается в молодом поколении) - Дорого инициализировать  Частая аллокация и освобождение объектов разных размеров приводит к фрагментации (для GC без дефрагментации или с частичной дефрагментацией) Поэтому избегайте использования больших объектов, но не в ущерб удобству
  • 26. Эффективное взаимодействие со сборщиком мусора: аллокация 26 www.ExigenServices.com Non-Uniform Memory Access (NUMA)  Доступ к памяти ассиметричен – процессоры имеют разные задержки при доступе к различным участкам памяти - SPARC, Opteron, некоторые процессоры Intel  NUMA-аллокатор - Память под объект выделяется «ближе» к процессору, на котором выполняется аллоцирующий поток - Доступ к объектам быстрее из потока, в котором произведена аллокация  Включается явно: -XX: +UseNUMA  JDK6u2, для Solaris ≥ 9, в Linux (с Linux kernel 2.6.19 и glibc 2.6.1)
  • 27. Эффективное взаимодействие со сборщиком мусора: аллокация 27 www.ExigenServices.com Обнуление ссылок  Редко помогает GC - GC в состоянии определить, доступен ли объект - Делает код менее читаемым - Может породить скрытые ошибки  Исключения - Структуры, основанные на массивах (в этом случае мы сами управляет памятью) - Предотвращение утечки памяти, связанной с финализацией
  • 28. Эффективное взаимодействие со сборщиком мусора: аллокация 28 www.ExigenServices.com Пулы объектов  Наследие старых VM с очень медленной скоростью аллокации  Необходимо помнить - GC с поколениями оптимизированы для работы с маложивущими неизменяемыми объектами - Локальные объекты могут быть оптимизированы  Неиспользуемые объекты в пулах - Лишняя работа для GC по сканированию/копированию - Не приносит пользы, если приложение их не использует
  • 29. Эффективное взаимодействие со сборщиком мусора: аллокация 29 www.ExigenServices.com Исключения  Объекты, которые дорого инициализировать  Объекты, которые связаны с редкими ресурсами - Потоки - Соединение к БД
  • 30. Эффективное взаимодействие со сборщиком мусора: аллокация 30 www.ExigenServices.com  Излишняя аллокация  Правильная версия  Старайтесь реалистично оценивать размер структур данных
  • 31. Эффективное взаимодействие со сборщиком мусора: System.gc() 31 www.ExigenServices.com  Не используйте явных вызовов GC - GC обладает информацией о скорости аллокации, заполненности старшего поколения… - System.gc() может повредить производительности  Исключения - Вызов System.gc() в период явного бездействия системы  В HotSpot - System.gc() вызывает полный stop-the-world GC - -XX: +DisableExplicitGC позволяет игнорировать System.gc()
  • 32. Эффективное взаимодействие со сборщиком мусора: финализация  Основное применение – освобождение системных ресурсов  Финализируемые объекты – все с непустым finalize()  Аллокация финализируемых объектов 32 www.ExigenServices.com - Существенно медленнее - VM должна их отслеживать
  • 33. Эффективное взаимодействие со сборщиком мусора: финализация Использование финализации для управления системными ресурсами  GC выполняет много работы по сопровождению объекта с непустым finalize() и перед тем, как этот объект будет финализирован  GC вызывается, когда заканчивается память  Памяти обычно больше, чем других системных ресурсов Поэтому управляйте ресурсами явно – используйте 33 www.ExigenServices.com пулы
  • 34. Эффективное взаимодействие со сборщиком мусора: утечка памяти Утечка памяти в системах со сборкой мусора вызывается – Объектами, которые доступны, но не используются – Использованием механизмов финализации (временная утечка) 34 www.ExigenServices.com
  • 35. Эффективное взаимодействие со сборщиком мусора: утечка памяти 35 www.ExigenServices.com Стандартные случаи утечки памяти  Забытые обработчики событий в Swing, AWT и т.д.  Исключения могут менять порядок выполнения
  • 36. Эффективное взаимодействие со сборщиком мусора: утечка памяти 36 www.ExigenServices.com Обнаружение утечек памяти  jconsole  jstat  VisualVM  jmap  -XX: PrintClassHistogram и Ctrl + Break
  • 37. 37 www.ExigenServices.com Полезные ссылки  Список опций JVM http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp- 140102.html  Этот тренинг подготовлен на основе доклада Екатерины Павловой «Оптимизация производительности: эффективная работа с виртуальной машиной» http://conference.javatalks.ru/data/JVMTalk.pdf  Блоги по этим и многим другим вопросам http://javablogs.com