SlideShare a Scribd company logo
1 of 38
Оптимизация производительности:
эффективное взаимодействие с виртуальной
машиной


      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

More Related Content

Similar to Performance optimization: effective interaction with virtual machine

Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesDenis Izmaylov
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Ontico
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)Ontico
 
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...it-people
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04Computer Science Club
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningOdessaJS Conf
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMaria Kuneva
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptFDConf
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5Provectus
 
Nikita Galkin "5 production Node.js stories"
Nikita Galkin "5 production Node.js stories"Nikita Galkin "5 production Node.js stories"
Nikita Galkin "5 production Node.js stories"OdessaJS Conf
 

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

Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)
 
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
DUMP-2013 Serverside - Архитектура Битрикс24 в Amazon Web Services – изнутри ...
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04
 
Lime.JS
Lime.JSLime.JS
Lime.JS
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
Build your own multistack JS startup
Build your own multistack JS startupBuild your own multistack JS startup
Build your own multistack JS startup
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
 
Nikita Galkin "5 production Node.js stories"
Nikita Galkin "5 production Node.js stories"Nikita Galkin "5 production Node.js stories"
Nikita Galkin "5 production Node.js stories"
 

More from Return on Intelligence

Profsoux2014 presentation by Pavelchuk
Profsoux2014 presentation by PavelchukProfsoux2014 presentation by Pavelchuk
Profsoux2014 presentation by PavelchukReturn on Intelligence
 
Types of testing and their classification
Types of testing and their classificationTypes of testing and their classification
Types of testing and their classificationReturn on Intelligence
 
Service design principles and patterns
Service design principles and patternsService design principles and patterns
Service design principles and patternsReturn on Intelligence
 
Differences between Testing in Waterfall and Agile
Differences between Testing in Waterfall and AgileDifferences between Testing in Waterfall and Agile
Differences between Testing in Waterfall and AgileReturn on Intelligence
 
Организация внутренней системы обучения
Организация внутренней системы обученияОрганизация внутренней системы обучения
Организация внутренней системы обученияReturn on Intelligence
 
Shared position in a project: testing and analysis
Shared position in a project: testing and analysisShared position in a project: testing and analysis
Shared position in a project: testing and analysisReturn on Intelligence
 
Оценка задач выполняемых по итеративной разработке
Оценка задач выполняемых по итеративной разработкеОценка задач выполняемых по итеративной разработке
Оценка задач выполняемых по итеративной разработкеReturn on Intelligence
 
Successful interview for a young IT specialist
Successful interview for a young IT specialistSuccessful interview for a young IT specialist
Successful interview for a young IT specialistReturn on Intelligence
 

More from Return on Intelligence (20)

Profsoux2014 presentation by Pavelchuk
Profsoux2014 presentation by PavelchukProfsoux2014 presentation by Pavelchuk
Profsoux2014 presentation by Pavelchuk
 
Agile Project Grows
Agile Project GrowsAgile Project Grows
Agile Project Grows
 
Types of testing and their classification
Types of testing and their classificationTypes of testing and their classification
Types of testing and their classification
 
Time Management
Time ManagementTime Management
Time Management
 
Service design principles and patterns
Service design principles and patternsService design principles and patterns
Service design principles and patterns
 
Differences between Testing in Waterfall and Agile
Differences between Testing in Waterfall and AgileDifferences between Testing in Waterfall and Agile
Differences between Testing in Waterfall and Agile
 
Windows Azure: Quick start
Windows Azure: Quick startWindows Azure: Quick start
Windows Azure: Quick start
 
Windows azurequickstart
Windows azurequickstartWindows azurequickstart
Windows azurequickstart
 
Организация внутренней системы обучения
Организация внутренней системы обученияОрганизация внутренней системы обучения
Организация внутренней системы обучения
 
Shared position in a project: testing and analysis
Shared position in a project: testing and analysisShared position in a project: testing and analysis
Shared position in a project: testing and analysis
 
Introduction to Business Etiquette
Introduction to Business EtiquetteIntroduction to Business Etiquette
Introduction to Business Etiquette
 
Agile Testing Process
Agile Testing ProcessAgile Testing Process
Agile Testing Process
 
Оценка задач выполняемых по итеративной разработке
Оценка задач выполняемых по итеративной разработкеОценка задач выполняемых по итеративной разработке
Оценка задач выполняемых по итеративной разработке
 
Meetings arranging
Meetings arrangingMeetings arranging
Meetings arranging
 
How to develop your creativity
How to develop your creativityHow to develop your creativity
How to develop your creativity
 
Introduction to python
Introduction to pythonIntroduction to python
Introduction to python
 
The art of project estimation
The art of project estimationThe art of project estimation
The art of project estimation
 
Successful interview for a young IT specialist
Successful interview for a young IT specialistSuccessful interview for a young IT specialist
Successful interview for a young IT specialist
 
Risk Management
Risk ManagementRisk Management
Risk Management
 
Resolving conflicts
Resolving conflictsResolving conflicts
Resolving conflicts
 

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