Performance optimization: effective interaction with virtual machine

Return on Intelligence
Return on IntelligenceReturn on Intelligence
Оптимизация производительности:
эффективное взаимодействие с виртуальной
машиной


      September 5, 2012   www.ExigenServices.com
Цели тренинга




 Узнать некоторые подробности устройства JVM
  вообще и HotSpot JVM в частности
 Научиться писать код, который работает
  быстрее
 Узнать об утилитах для работы с JVM



                                   2   www.ExigenServices.com
Содержание



 Некоторые моменты архитектуры HotSpot
  JVM
 Эффективное взаимодействие с JIT-
  компилятором
 Эффективное взаимодействие со сборщиком
  мусора




                                  3   www.ExigenServices.com
Архитектура HotSpot JVM


 Runtime
   Загрузка классов…
 Сборщик мусора
 Интрепретатор
 JIT
   Клиентский
   Серверный


                                 4   www.ExigenServices.com
Содержание




 Архитектура HotSpot JVM
 Эффективное взаимодействие с JIT-
  компилятором
 Эффективное взаимодействие со сборщиком
  мусора




                                  5   www.ExigenServices.com
Эффективное взаимодействие с JIT-
            компилятором: типы компиляторов

 client - 32bit
   - простой, ориентирован на приложения клиентского типа
      (апплеты, игры)
   - работает быстро, важна скорость запуска приложений
   - генерирует менее оптимальный код

 server – 32bit, 64bit
   - сложный, ориентирован на приложения серверного типа
   - работает дольше, важна производительность создаваемого
     кода
   - более серьѐзный анализ, сбор большей статистики =>
     применение более агрессивных оптимизаций

                                                6    www.ExigenServices.com
Эффективное взаимодействие с JIT-
         компилятором: типы компиляторов

 Машины серверного класса:
    Памяти ≥ 2Gb
    Количество cpu ≥ 2
 Компилятор, выбираемый по умолчанию




                                        7   www.ExigenServices.com
Эффективное взаимодействие с JIT-
               компилятором: типы компиляторов

Какой компилятор работает?

    Используйте jinfo (Java SE 6)
    Или вызовите



    Или используйте java –version



    Или просто поменяйте тип компилятора:
         java –client MyClass.class
         java –server MyClass.class




                                             8   www.ExigenServices.com
Эффективное взаимодействие с JIT-
            компилятором: escape-анализ

                        Escape-анализ
 Является частью серверного компилятора
 Использует понятие непокидающего объекта. Объект О
  называется непокидающим для метода М, если:
   - объявлен внутри метода M
   - не является объектом класса Thread или производного от
     него
   - не имеет финализатора
   - не сохраняется в статическом поле класса или в поле
     покидающего объекта
   - не передается другому методу в качестве аргумента, если
     только достоверно не известно, что O не покидает и этот
     метод
                                                 9    www.ExigenServices.com
Эффективное взаимодействие с JIT-
           компилятором: escape-анализ




Объекты i1 и e1 являются непокидающими
                                         10   www.ExigenServices.com
Эффективное взаимодействие с JIT-
         компилятором: escape-анализ


Возможные оптимизации:
   Устранение блокировок на непокидающих
    объектах
   Оптимизация ссылок на объекты
   В ряде случаев – размещение объекта в
    стеке или регистрах, а не в куче



                                  11   www.ExigenServices.com
Эффективное взаимодействие с JIT-
            компилятором: синхронизация

Синхронизация java-объектов
 Операции захвата/освобождения объектов дорогие
 В большинстве случаев захват объекта не является
  состязательным:
   - либо объект был свободным
   - либо произошѐл рекурсивный захват в рамках потока

Решение:
 Использование легковесных блокировок (эквивалентов CAS -
  compare-and-swap – инструкций), это быстро
 Использование тяжеловесных блокировок, если невозможно
  использовать легковесные – это на порядок медленнее

                                               12   www.ExigenServices.com
Эффективное взаимодействие с JIT-
          компилятором: синхронизация

Использование CAS-инструкций может быть дорогим на
  многопроцессорных машинах



   Решение – привязанные (biased) блокировки
   Минус – дорогая операция отката привязки. JVM
    анализирует статистику откатов связывания и
    может запретит привязывания блокировки для
    определѐнных типов объектов
   -XX: +UseBiasedLocking (начиная с 5.0 update 6)


                                          13   www.ExigenServices.com
Эффективное взаимодействие с JIT-
            компилятором

 Пропуск блокировки (lock elision)
- Избежание блокировки над локальными переменными




- -XX: +DoEscapeAnalisys
 Укрупнение блокировки(lock coarsening)
- Объединение смежных synchronized блоков




- -XX: +EliminateLocks
                                            14      www.ExigenServices.com
Эффективное взаимодействие с JIT-
         компилятором

Советы по синхронизации:



 Сразу рассчитывайте на использование вашего
  кода в многопоточных приложениях.
  Экономить на синхронизации нет смысла
 Используйте средства обнаружения
  состязательных блокировок (например, jvmstat)


                                     15   www.ExigenServices.com
Содержание




 Архитектура HotSpot JVM
 Эффективное взаимодействие с JIT-
  компилятором
 Эффективное взаимодействие со
  сборщиком мусора




                                      16   www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: принципы работы

Сборка мусора (GC)

 Размещает объекты в памяти, находит и освобождает место,
  занимаемое ненужными объектами
 Автоматическая и безопасная
 Проще, если граф объектов «заморожен» (stop-the-world
  паузы)
 Возможны различные подходы
   - С дефрагментацией или без
   - Разные алгоритмы
   - С разными типами аллокации (размещения объектов в
     памяти) – например, учитывая «близость» области памяти к
     процессору
                                                17   www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: принципы работы

Сборка мусора с поколениями

 Молодые и старые объекты содержатся отдельно
   - В пространствах, называемых «поколениями»
   - Возможны различные алгоритмы для молодого и старого
     поколения
   - Есть ещѐ третье пространство - Permanent Generation,
     содержащее данные о загруженных классах,
     откомпилированные методы и т.д.
 Слабая гипотеза о поколениях
   - Большинство объектов временные
   - Молодое поколение можно собирать отдельно от старого

                                               18   www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: принципы работы

Фоновая сборка мусора

   – Уменьшает влияние GC на приложение
   – Сборка мусора происходит одновременно с работой
     приложения
   – Если фоновый GC собирает только старшее поколение, нет
     необходимости отслеживать изменения в молодом
     поколении




                                              19    www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: принципы работы

 Последовательный / Serial GC
   – Молодое поколение – последовательный копирующий GC,
     старое – Mark-Sweep Compact
   – Отлично подходит для клиентских приложений, не
     требующих много памяти (≤ 200 Mb)
   – “stop-the-world” сборщик – длительные паузы при больших
     объѐмах
 Фоновый / Concurrent Mark-Sweep GC
   – Предназначен для избегания “stop-the-world” пауз
   – Приводит к увеличению нагрузки на процессор, снижая
     общую производительность


                                                20    www.ExigenServices.com
Эффективное взаимодействие со
               сборщиком мусора: принципы работы

Как узнать про сборку мусора?

   jmap, jmap –heap, jmap –histo
   -verbose:gc
   -XX: +PrintGC
   -XX: +PrintGCDetails
   -XX: PrintHeapAtGC
   -XX: PrintGCTimeStamps
   jconsole
   jvisualVM
   YourKit Profile


                                      21   www.ExigenServices.com
Эффективное взаимодействие со
сборщиком мусора: jvisualvm




                          22    www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: аллокация

 Быстрая аллокация
   - Новый объект выделяется в молодом поколении
   - Не нужно отслеживать изменение ссылок
   - Гораздо быстрее, чем стандартные аллокаторы для С/С++
 Быстрое освобождение новых объектов
   - Сборка молодого поколения

Совет:
   – Не бойтесь выделять маленькие объекты для
     промежуточных результатов
   – Избегайте бессмысленных аллокаций, они приводят к
     лишним вызовам GC


                                               23   www.ExigenServices.com
Эффективное взаимодействие со
         сборщиком мусора: аллокация

Также не стоит забывать про анализ
  локальности (escape analysis), поэтому:


   Используйте неизменяемые маложивущие
    объекты вместо часто изменяемых
    долгоживущих объектов
   Используйте простой код с большим
    количеством аллокаций вместо сложных
    контрукций с меньшим количеством
    аллокаций

                                      24    www.ExigenServices.com
Эффективное взаимодействие со
          сборщиком мусора: аллокация

 Большие объекты
   - Долго аллоцировать (если объект не помещается в
     молодом поколении)
   - Дорого инициализировать
 Частая аллокация и освобождение объектов разных
  размеров приводит к фрагментации (для GC без
  дефрагментации или с частичной дефрагментацией)



 Поэтому избегайте использования больших объектов,
                но не в ущерб удобству
                                         25   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)
                                                        26     www.ExigenServices.com
Эффективное взаимодействие со
          сборщиком мусора: аллокация

Обнуление ссылок

 Редко помогает GC
   - GC в состоянии определить, доступен ли объект
   - Делает код менее читаемым
   - Может породить скрытые ошибки
 Исключения
   - Структуры, основанные на массивах (в этом
     случае мы сами управляет памятью)
   - Предотвращение утечки памяти, связанной с
     финализацией
                                         27   www.ExigenServices.com
Эффективное взаимодействие со
           сборщиком мусора: аллокация

Пулы объектов

 Наследие старых VM с очень медленной скоростью аллокации
 Необходимо помнить
   - GC с поколениями оптимизированы для работы с
     маложивущими неизменяемыми объектами
   - Локальные объекты могут быть оптимизированы
 Неиспользуемые объекты в пулах
   - Лишняя работа для GC по сканированию/копированию
   - Не приносит пользы, если приложение их не использует



                                              28   www.ExigenServices.com
Эффективное взаимодействие со
        сборщиком мусора: аллокация


Исключения

   Объекты, которые дорого инициализировать
   Объекты, которые связаны с редкими
    ресурсами
     - Потоки
     - Соединение к БД


                                   29   www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: аллокация


 Излишняя аллокация




 Правильная версия



 Старайтесь реалистично оценивать размер структур данных




                                               30   www.ExigenServices.com
Эффективное взаимодействие со
          сборщиком мусора: System.gc()

 Не используйте явных вызовов GC
   - GC обладает информацией о скорости аллокации,
     заполненности старшего поколения…
   - System.gc() может повредить производительности
 Исключения
   - Вызов System.gc() в период явного бездействия
     системы
 В HotSpot
   - System.gc() вызывает полный stop-the-world GC
   - -XX: +DisableExplicitGC позволяет игнорировать
     System.gc()
                                         31   www.ExigenServices.com
Эффективное взаимодействие со
         сборщиком мусора: финализация


 Основное применение – освобождение
  системных ресурсов
 Финализируемые объекты – все с непустым
  finalize()
 Аллокация финализируемых объектов
   - Существенно медленнее
   - VM должна их отслеживать



                                  32   www.ExigenServices.com
Эффективное взаимодействие со
           сборщиком мусора: финализация

Использование финализации для управления
  системными ресурсами
    GC выполняет много работы по сопровождению
     объекта с непустым finalize() и перед тем, как этот
     объект будет финализирован
    GC вызывается, когда заканчивается память
    Памяти обычно больше, чем других системных
     ресурсов

Поэтому управляйте ресурсами явно – используйте
  пулы
                                             33   www.ExigenServices.com
Эффективное взаимодействие со
         сборщиком мусора: утечка памяти


Утечка памяти в системах со сборкой мусора
  вызывается

  – Объектами, которые доступны, но не
    используются

  – Использованием механизмов финализации
    (временная утечка)


                                    34   www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: утечка памяти

              Стандартные случаи утечки памяти

 Забытые обработчики событий в Swing, AWT и т.д.




 Исключения могут менять порядок выполнения




                                                 35   www.ExigenServices.com
Эффективное взаимодействие со
            сборщиком мусора: утечка памяти

Обнаружение утечек памяти

   jconsole
   jstat
   VisualVM
   jmap
   -XX: PrintClassHistogram и Ctrl + Break



                                          36   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




                                                     37    www.ExigenServices.com
Вопросы




          38   www.ExigenServices.com
1 of 38

Recommended

Как анимировать тысячи объектов на карте и не подвесить браузер by
Как анимировать тысячи объектов на карте и не подвесить браузерКак анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерDotNetConf
432 views35 slides
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012 by
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012Vladimir Ivanov
3.5K views51 slides
Павел Прищепа - Drupal хостинг полного цикла by
Павел Прищепа - Drupal хостинг полного циклаПавел Прищепа - Drupal хостинг полного цикла
Павел Прищепа - Drupal хостинг полного циклаDrupalSPB
655 views26 slides
Performance optimization effective interaction with virtual machine by
Performance optimization effective interaction with virtual machinePerformance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machineReturn on Intelligence
472 views38 slides
Quick Start to AngularJS by
Quick Start to AngularJSQuick Start to AngularJS
Quick Start to AngularJSReturn on Intelligence
562 views22 slides
Effective Feedback by
Effective FeedbackEffective Feedback
Effective FeedbackReturn on Intelligence
292 views15 slides

More Related Content

Similar to Performance optimization: effective interaction with virtual machine

Микросервисная архитектура на базе CoreOS и Kubernetes by
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesDenis Izmaylov
1.9K views110 slides
Dz Java Hi Load 0.4 by
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
1.2K views16 slides
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при... by
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Ontico
2.9K views58 slides
Секреты сборки мусора в Java (Алексей Рагозин) by
Секреты сборки мусора в Java (Алексей Рагозин)Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)Ontico
1.7K views53 slides
Секреты сборки мусора в Java by
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
20K views53 slides
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ... by
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...it-people
895 views31 slides

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

Микросервисная архитектура на базе CoreOS и Kubernetes by Denis Izmaylov
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
Denis Izmaylov1.9K views
Dz Java Hi Load 0.4 by HighLoad2009
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
HighLoad20091.2K views
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при... by Ontico
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Ontico2.9K views
Секреты сборки мусора в Java (Алексей Рагозин) by Ontico
Секреты сборки мусора в Java (Алексей Рагозин)Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)
Ontico1.7K views
Секреты сборки мусора в Java by aragozin
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
aragozin20K views
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ... by it-people
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
it-people895 views
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один by SECON
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON198 views
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один by SECON
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON343 views
Mihail Zachepilo - WebAssembly powered Machine Learning by Maria Kuneva
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
Maria Kuneva50 views
Mihail Zachepilo - WebAssembly powered Machine Learning by OdessaJS Conf
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
OdessaJS Conf112 views
Построение мультисервисного стартапа в реалиях full-stack javascript by FDConf
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
FDConf2.7K views
Масштабируемая архитектура фронтенда by Roman Dvornov
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
Roman Dvornov172 views
Разница в подходах анализа кода компилятором и выделенным инструментом by Tatyanazaxarova
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
Tatyanazaxarova272 views
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один by HappyDev
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
HappyDev294 views
Desktop app based on node js and html5 by Provectus
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
Provectus765 views
Nikita Galkin "5 production Node.js stories" by OdessaJS Conf
Nikita Galkin "5 production Node.js stories"Nikita Galkin "5 production Node.js stories"
Nikita Galkin "5 production Node.js stories"
OdessaJS Conf76 views

More from Return on Intelligence

Profsoux2014 presentation by Pavelchuk by
Profsoux2014 presentation by PavelchukProfsoux2014 presentation by Pavelchuk
Profsoux2014 presentation by PavelchukReturn on Intelligence
780 views21 slides
Agile Project Grows by
Agile Project GrowsAgile Project Grows
Agile Project GrowsReturn on Intelligence
884 views27 slides
Types of testing and their classification by
Types of testing and their classificationTypes of testing and their classification
Types of testing and their classificationReturn on Intelligence
12.8K views42 slides
Time Management by
Time ManagementTime Management
Time ManagementReturn on Intelligence
954 views37 slides
Service design principles and patterns by
Service design principles and patternsService design principles and patterns
Service design principles and patternsReturn on Intelligence
4.2K views56 slides
Differences between Testing in Waterfall and Agile by
Differences between Testing in Waterfall and AgileDifferences between Testing in Waterfall and Agile
Differences between Testing in Waterfall and AgileReturn on Intelligence
30.4K views21 slides

More from Return on Intelligence(20)

Организация внутренней системы обучения by Return on Intelligence
Организация внутренней системы обученияОрганизация внутренней системы обучения
Организация внутренней системы обучения
Оценка задач выполняемых по итеративной разработке by Return on Intelligence
Оценка задач выполняемых по итеративной разработкеОценка задач выполняемых по итеративной разработке
Оценка задач выполняемых по итеративной разработке

Performance optimization: effective interaction with virtual machine

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