Производительность и многопоточность на Java-конференции JPoint 2016
Всего 8 недель осталось до крупнейшей в России Java-конференции JPoint 2016. Я уже рассказывал на хабре, что нас с вами ожидает:
- два дня под одной крышей в центре Москвы
- около 40 докладов в четырёх параллельных залах. Мы хотели сделать 36 докладов, как на Joker, но видимо всё же, уплотним сетку и сделаем 44 доклада
- море общения с коллегами — около 1000 Java-программистов приедут к нам отовсюду
Я попробую потихоньку рассказать про основные темы JPoint и начну с нашей любимой — производительность и многопоточность.
На эту тему уже анонсированы следующие доклады:
- Алексей Шипилёв, Oracle — Если не Unsafe, то кто: восход VarHandles
- Сергей Куксенко, Oracle — Quantum Performance Effects, level up. За пределами ядра
- Руслан Черёмин, Deutsche Bank — Escape Analysis и скаляризация
- Владимир Ситников, NetCracker — Ну и производительность у вашего OpenSource!
- Volker Simonis, SAP — HotSpot Intrinsics
- Алексей Шипилёв, Oracle — The Lord of the Strings: Two Scours
- Тагир Валеев — Stream API puzzlers
- Владимир Иванов, Oracle — Native код, Off-heap данные и Java
- Владимир Озеров, GridGain — (Почти) неблокирующая синхронизация
Алексей Шипилёв, Oracle — Если не Unsafe, то кто: восход VarHandles
Алексей работает над производительностью Java около 10 лет. За это время он успел позаниматься Apache Harmony в Intel, затем перешёл в Sun Microsystems, а потом и в Oracle, где сегодня работает над Sun/Oracle JDK, главным образом над изменениями, связанными с производительностью JVM, библиотек классов, фреймворков и приложений. Разрабатывает и поддерживает под-проекты OpenJDK: JMH, jcstress, JOL. Работает в экспертных группах, связанных с формализацией, тестированием и производительностью concurrency.
Алексей много раз выступал на JPoint, а в прошлом году — так и вовсе разорвал всех в клочья.
В этом докладе будет дан обзор работ вокруг VarHandles (JEP 193): что там за API, как в крупную клетку устроена референсная реализация, какие новые режимы доступа (acquire/release, opaque/relaxed, compareAndSet/compareAndExchange) она даёт, и как мы умудряемся её скомпилировать в практически голые доступы.
Кроме того, мы посмотрим на то, какой sun.misc.Unsafe плохой, какие грабли нам подкладывают текущие JDK/JVM, какие хардварные проблемы подтачивают красивый гранит реализации. С позитивной стороны мы увидим побочные улучшения в JDK/JVM: оптимизации в ByteBuffers, Atomic*FieldUpdaters, и прочие общие кодогенерационные улучшения.
Руслан Черёмин, Deutsche Bank — Escape Analysis и скаляризация
Руслан давно занимается производительностью Java-решений и ведет популярный блог про Performance, на который постоянно ссылаются все, кто так или иначе занимается перфомансом в русскоязычном мире. Если вас интересует джавовский перфоманс и вы еще не подписаны на блог Руслана — непременно подпишитесь. Ну и почитайте его прямо на ближайших выходных — взрыв мозга гарантирован!
И кстати, Руслан уже выступал на JPoint и JUG три года назад. Вот видео его доклада про Disruptor:
Теперь про текущий доклад.
Escape analysis и Scalar replacement появились в Java еще в версии 6.0, и их включение действительно заметно снижает нагрузку на GC. Но вот надежного понимания, в каких конкретных участках кода на скаляризацию можно положиться, а в каких — нет, у Руслана за эти годы так и не сложилось. В сети можно найти массу историй успеха в духе «а вот в таком коде совсем-совсем нет аллокаций!», но приведенный код часто оказывается очень хрупким: иногда достаточно поправить одну-две строчки, как все волшебство исчезает.
Доклад — попытка привнести больше понимания в этот вопрос. Будет кратко описан сам алгоритм escape-анализа и его врожденные ограничения, и на примерах будут рассмотрены ограничения реализации его в HotSpot JVM JIT.
Владимир Ситников, NetCracker — Ну и производительность у вашего OpenSource!
Владимир более 10 лет работает над производительностью и масштабируемостью NetCracker OS — ПО, используемого операторами связи для автоматизации процессов управления сетью и сетевым оборудованием. Увлекается вопросами производительности Java и Oracle Database. Автор более десятка улучшений производительности в официальном PostgreSQL JDBC драйвере.
Общедоступные программы и библиотеки подкупают своей бесплатностью. Если же исходный код открыт, то все сразу думают, что «умные дядьки уже исправили всё, что нужно». На практике же оказывается, что грабли разложены там, где их мало кто ждёт. Тормозит всё, кроме, разве что, самой java. В докладе мы рассмотрим примеры проблем производительности при использовании таких библиотек как Wildfly, Spring, HornetQ, pgjdbc.
Например, оказывается, что spring.getBean тормозит, а в комбинации с autoproxy вообще может занимать до 50% времени приложения. Cglib мешает работе garbage collector«а в попытках проксировать Object#finalize, а HornetQ внезапно притормаживает отправку JMS, что запросто приводит к 5-и секундным задержкам на одно сообщение. Владимир расскажет, как их опознать и обезвредить.
Сергей Куксенко, Oracle — Quantum Performance Effects, level up. За пределами ядра
Сергей — Java Performance Engineer, работает с Java начиная с версии 1.0. За это время успел поучаствовать в разработке мобильных, клиентских, серверных приложений, а также виртуальных машин. Производительностью Java занимается уже более 10 лет: сначала работал в Intel над Apache Harmony, а в данный момент в Oracle занимается производительностью OracleJDK/OpenJDK (его 3-я JVM).
Сергей сделает доклад, который будет продолжением его предыдущего хардкорного доклада про Quantum Performance Effects. Подробности будут со дня на день, а пока — вот вам видео первой части:
Алексей Шипилёв, Oracle — The Lord of the Strings: Two Scours
java.lang.String — один из наиболее часто используемых классов в Java приложениях. Не удивительно, что инженеры Oracle пытаются его улучшать и микро-, и макро-оптимизациями. В докладе будут освещены вопросы рациональности, подходов к реализации, практических граблей, с которыми сталкиваются разработчики JDK, пытающиеся ничего не сломать в огромной экосистеме, а также чем эта подковёрная деятельность грозит простым пользователям.
В этом докладе будут рассмотрены две грядущие фичи в JDK 9, направленные на оптимизацию строк: Compact Strings, сжимающие строки с однобайтовыми символами, что улучшает футпринт и даже общую производительность; и Indify String Concat, использующий магию invokedynamic для конкатенации строк, позволяющий подкручивать реализацию конкатенации без рекомпиляции программ.
Тагир Валеев — Stream API puzzlers
На хабре Тагир известен как lany, лидер Java-хаба, и одно это делает ему хорошую рекламу :) Тагир разрабатывает и поддерживает системы автоматизации научных исследований в области генетики, молекулярной и системной биологии. Участвует в проекте статического анализа кода FindBugs. Разрабатывает открытую библиотеку StreamEx, расширяющую возможности Java 8 Stream API. Читает лекции по машинной графике в НГУ.
На разных конференциях было много докладов на тему, что такое Stream API и как им пользоваться. В докладе мы сосредоточимся на деталях реализации: какие операции выполняются быстро, какие медленно, какие неожиданно кушают много памяти, какие просто ведут себя странно. Будет разобрано, какие баги есть в Java 8 Stream API и что будет исправлено в Java 9. Кроме того будет показано, как решать некоторые нетривиальные задачи. Ну и, конечно, будет немного рекламы OpenSource-библиотеки StreamEx.
Владимир Иванов, Oracle — Native код, Off-heap данные и Java
Владимир — ведущий инженер Oracle, работает в группе разработки виртуальной Java-машины HotSpot. Специализируется на JIT-компиляции и поддержке альтернативных языков на платформе Java. Работает над созданием новых механизмов работы с native кодом и off-heap данными (Project Panama).
Доклады у Владимира обычно зубодробительны. Предыдущий обзор новинок в JVM Владимир делал полтора года назад на Joker 2014:
О чем же расскажет Владимир в этот раз?
Работа с native кодом и off-heap данными из Java привлекательна, но сопряжена с рядом трудностей. Разговор пойдет о существующих методах взаимодействия с native кодом и способах работы с off-heap данными. Существенная часть доклада будет отведена рассказу о нововведениях в JDK 9 (JEP 193: VarHandles) и тому, что планируется на более отдаленную перспективу в Project Panama: новый интерфейс для доступа к native-коду, идущий на смену JNI (JEP 191: Foreign Function Interface), Layout Descriptor Language (LDL) и Arrays 2.0.
Владимир Озеров, GridGain — (Почти) неблокирующая синхронизация
Владимир — архитектор компании GridGain. Комитер и PMC member проекта Apache Ignite. Занимается вопросами распределенных вычислений, кэширования и репликации, интеграцией с .NET/C++, разработкой модулей для экосистемы Hadoop.
Неблокирующая синхронизация — полезный и мощный инструмент многопоточного программирования. Но зачастую знания разработчиков о ней ограничиваются словами «круто», «сложно» и «перфоманс». Как именно использовать неблокирующие алгоритмы на практике? Чем конкретно они могут помочь джависту? И где спрятан тот самый перфоманс?
В докладе будут рассмотрены задачи, решаемые неблокирующей синхронизацией в мире Java. Вместе с Владимиром слушатели
- прорвутся через дебри заумной теории;
- выделят основные кирпичики построения неблокирующих алгоритмов;
- научатся сочетать блокирующие и неблокирующие техники;
- разберут примеры из реальных проектов — удачные и не очень.
Volker Simonis, SAP — HotSpot Intrinsics
Фолькер — JVM-инженер с огромным опытом, работает над SAP JVM. Он является контрибьютором OpenJDK с самого начала ее существования и помогает SAP вносить различные улучшения в HotSpot JVM. Фолькер возглавляет проект по портированию OpenJDK на PowerPC/AIX, коммитит в JDK8 и ревьюит коммиты в JDK9.
На прошлом JPoint Фолькер рассказывал про различные подходы к ускорению работы с массивами объектов:
В этот раз Фолькер расскажет про JVM Intrinsics — специальные функции внутри HotSpot и других JVM, которые позволяют вашему коду выполняться быстрее. Как мы знаем HotSpot JVM работает на огромном количестве платформ, и поэтому весь его код более-менее поделен на общий и специфичный для конкретного железа или конкретной операционки (а иногда для пары железо+ОС). Соответственно, в ряде случаев исполняемый код можно ускорить, если использовать специальные процессорные инструкции. Типичный пример — использовать для методов типа AtomicInteger.getAndAdd (int) инструкции типа lock add вместо CAS-loop’а. Или, например, использовать SIMD-инструкции для методов equals и hashCode на строках.
В данном докладе будет дан обзор существующих в HotSpot интринсиков и будет объяснено, как они реализованы, как можно контролировать их использование и, наконец, как можно добавить intrinsic в ваш любимый Java-метод.
Вполне вероятно, что в ближайшие несколько дней у нас появится еще пара докладов про Performance — один от Сергей Куксенко, а второй — от Concurrency-эксперта и Java Champion’а Романа Елизарова. Кроме того, ряд докладов очень сильно связан с перфомансом:
- доклады про распределенные системы от Олега Анастасьева из Одноклассников и Романа Гребенникова;
- доклад про распределенные кеши от Виктора Гамова из Hazelcast;
- доклад про профилировщики от Антона Архипова из Zeroturnaround.
С этими и другими докладами вы можете ознакомиться тут.
Ну, а в комментариях я, как всегда, жду ваших вопросов по этим докладам или вообще про JPoint.