Aleksey Shipilëv: One Stop Page

Quick Bio

Or, "the text I keep copypasting around conferences", therefore written in third person.

(ENG) Aleksey is working on Java performance for 10+ years. Today he is employed by Red Hat, where he does OpenJDK development and performance work. Aleksey develops and maintains a number of OpenJDK subprojects, including JMH, JOL, and JCStress. He is also an active participant in expert groups and communities dealing with performance and concurrency. Prior joining Red Hat, Aleksey was working on Apache Harmony at Intel, then moved to Sun Microsystems, which was later consumed by Oracle.

(RUS) Алексей работает над производительностью Java больше 10 лет. Сегодня он работает в Red Hat, где разрабатывает OpenJDK и работает над его производительностью. Алексей разрабатывает и поддерживает несколько под-проектов в OpenJDK, включая JMH, JOL, и JCStress. Алексей также активно участвует в экспертных группах и сообществах, работающих над вопросами производительности и многопоточности. Перед тем как перейти в Red Hat, Алексей работал над Apache Harmony в Intel, а затем перешёл в Sun Microsystems, которая была поглощена Oracle.

If you want to see me bragging about myself, look at my CV.


The resources below are my major Internet footprint. Don't hesitate to drop me a message if you see anything wrong there. I usually post the updates for this page on Twitter: @shipilev.

Recent Articles and Blog Posts

  (ENG) Close Encounters of The Java Memory Model Kind
Horror details about Java Memory Model abuses.
  (ENG) Arrays of Wisdom of the Ancients
Collection.toArray(new T[0]) or Collection.toArray(new T[size]), that's the question.
  (ENG) Faster Atomic*FieldUpdaters for Everyone
Improve A*FU performance with these weird tricks.
  (ENG) The Black Magic of (Java) Method Dispatch
Explores how HotSpot deals with Java method calls.
  (ENG) Safe Publication and Safe Initialization in Java
Explores the "Safe Publication" and "Safe Initialization" idioms.
This post is a translation and an update for a very outdated Russian post.
  (ENG) On The Fence With Dependencies
Explores the better instruction selection from StoreLoad barriers. Recaps the JDK-8050147 work.
  (ENG) Java Memory Model Pragmatics
Describes what is actually written in JMM Spec. This is the transcript for "Java Memory Model" talks.
  (ENG) Java vs. Scala: Divided We Fail
Highlights how to analyze bottlenecks in benchmarks; and how to deal with multi-language benchmarks.
  (ENG) Nanotrusting the Nanotime
Unfolds why System.nanoTime() is bad for your health.
  (ENG) All Accesses Are Atomic
Quantifies the access atomicity costs.
(Work in progress)
  (ENG) All Fields Are Final
Quantifies the final fields memory semantics, in the wake of JMM overhaul.
(Work in progress)
  (ENG) The Exceptional Performance of Lil' Exception
Explores the performance magic behind Java exceptions.
This is an update for two quite outdated Russian posts: 1, 2
Caution: a long article.
  (ENG) What Heap Dumps Are Lying to You About
Rant about HPROF, and how it confuses the offline heapdump tools.
Shameless promotion of Java Object Layout @ OpenJDK
  (ENG) Plans for 2014
Semi-reflection on 2013, and what's going to happen in 2014.


(RUS) SettableFuture<V>: How To Shoot Oneself in the Foot with Spherical Bicycle in the Vacuum
(saved from rapidly deteriorating Habrahabr)

(RUS) PGP Web of Trust: graphs and basic estimations
(saved from rapidly deteriorating Habrahabr)

(RUS) Exploring Reflection on HotSpot
(saved from rapidly deteriorating Habrahabr)

(RUS) Exploring multiple dispatch on HotSpot
(saved from rapidly deteriorating Habrahabr)

(RUS) Estimating compression and deduplication ratios on real data
(saved from rapidly deteriorating Habrahabr)

(RUS) VisualVM: monitoring, profiling, and diagnostics for Java applications
(saved from rapidly deteriorating Habrahabr)

Public Talks

The talks are arranged in themes. Many talks were given over multiple years, choose the most recent one. All other versions are kept for reference.

# Java Memory Model Pragmatics

Latest in Russian


(RUS) Слайды

Спецификация Java Memory Model в JLS пытается быть предельно сжатой и полной. Поскольку JMM пытается объять очень большой пласт явлений, её формализм весьма громоздок, что обернулось потерей понимабельности модели простыми смертными.

Понять хотя бы наполовину, что написано в спецификации Java Memory Model (далее — JMM), получается раза с третьего. Понять, почему записано именно так, по спецификации вообще невозможно, и приходится обращаться к дополнительным источникам, которые пытаются как-то формализм JMM переосмыслить, дополнить, и привести примеры.

В этом докладе мы попытаемся проследить за логикой построения модели; поговорим о том, каких прагматических результатов модель пыталась добиться; посмотрим, с какими ограничениями злого внешнего мира при этом пришлось столкнуться; увидим, как JMM пытается балансировать между требованиями девелоперов и требованиями разработчиков рантаймов и железа.

Latest in English

(ENG) Slides

(ENG) Talk transcript

The Java Memory Model is the most complicated part of Java spec that must be understood by at least library and runtime developers. Unfortunately, it is worded in such a way that it takes a few senior guys to decipher it for each other.

Most developers, of course, are not using JMM rules as stated, and instead make a few constructions out of its rules, or worse, blindly copy the constructions from senior developers without understanding the limits of their applicability. If you are an ordinary guy who is not into hardcore concurrency, you can pass this talk, and read high-level books, like “Java Concurrency in Practice”. If you are one of the senior folks interested in how all this works, join us!

In this talk, we will follow the logic of the model; review what pragmatic results the model was trying to achieve; look closely at the real world limitations the model had to endure; see how JMM tries to balance between developers’ needs and runtime/hardware maintainers requests.

Historical (e.g. outdated) materials

(ENG) JVMLS 2014: Java Memory Model Pragmatics
Workshop collaterals.

(RUS) JEEConf 2014: Java Memory Model Pragmatics
Video: JEEConf, Direct: part 1, 364 MB, Direct: part 2, 365 MB

(RUS) CodeFest 2014: Java Memory Model Pragmatics

(RUS) JUG.Ru 2014: Java Memory Model Pragmatics
Video: Youtube, Direct: 1090 MB

(RUS) JavaOne Russia 2013: Java Memory Model
(hosted for Sergey Kuksenko)

(RUS) JavaOne Moscow 2012: Java Memory Model
(hosted for Sergey Kuksenko)
Video: Youtube

(RUS) JavaDay Kiev 2011: Java Memory Model
(hosted for Sergey Kuksenko)


# java.lang.String Catechism

Latest in English

(ENG) Slides

Hardcore enterprise solutions, as well as other products, normally deal with large amount of text data. Those applications spend considerable time and memory to mess with Strings. It had been repeatedly shown that optimizing String usages will almost always give the immediate performance boosts. This is not to mention dodging OutOfMemoryErrors and the like.

In this talk, we will revisit the basic sins of working with Strings: gluttony of concatenation, wrath of substrings, greed of interning, pride of deduplication et cetera. We will also see the costs of sloth, believing JVM Almighty will do all the work for us.

Latest in Russian

(RUS) Слайды

В приложениях кровавого энтерпрайза и прочих продуктах, что так или иначе связаны с обработкой текстовых данных, порядочное количество памяти и времени тратится на возню со строками. Оптимизации работы со строками часто дают немедленный выигрыш, а то и уворачивание от OutOfMemoryError.

В этом докладе будут рассмотрены основные пороки работы со строками: чревоугодие конкатенации, блуд подстрок, корыстолюбие интернирования, гордыню дедупликации и прочее. Кроме того, речь пойдет о том, чего стоит излишняя надежда на JDK и JVM.

Historical (e.g. outdated) materials

None yet!


# The Lord Of The Strings

Latest in English

(ENG) Slides

java.lang.String is pervasively and perversely used in most Java applications. Not surprisingly, we are looking into optimizing it both on small and large scale.

In this talk, we will take a deeper look into two interesting String-related features coming in JDK 9: a) Compact Strings, that saves memory for Strings representable with single-byte chars, with little or none performance regressions, and in many cases, significant performance improvements; b) Indify String Concat, that uses the magic of invokedynamic to concatenate Strings, to free runtime implementors for optimizing string concatenation without pushing users to recompile their programs.

We will talk about the rationale, pitfalls and caveats of implementing the intrusive core library/runtime changes.

Latest in Russian

(RUS) Слайды

java.lang.String — один из наиболее часто используемых классов в Java приложениях. Не удивительно, что мы пытаемся его улучшать и микро- и макро-оптимизациями. В докладе будут освещены вопросы рациональности, подходов к реализации, практических граблей, с которыми сталкиваются разработчики JDK, пытающиеся ничего не сломать в огромной экосистеме, а также чем эта подковёрная деятельность грозит простым пользователям.

В этом докладе мы посмотрим на две грядущие фичи в JDK 9, направленные на оптимизацию строк: Compact Strings, сжимающие строки с однобайтовыми символами, что улучшает футпринт и даже общую производительность; и Indify String Concat, использующий магию invokedynamic для конкатенации строк, позволяющий подкручивать реализацию конкатенации без рекомпиляции программ.

Historical (e.g. outdated) materials

(RUS) JPoint 2016: The Lord of the Strings

(RUS) Joker 2015: The Lord of the Strings


# Compress Me Tightly

Latest in Russian

(RUS) Слайды

Контроль над использованием памяти — это ключ к написанию высокопроизводительного софта. В этом докладе мы покопаемся в кишках JVM и JDK, в поисках того, как сама платформа пытается сэкономить на памяти. Посмотрим на упаковку заголовков и полей объектов, сжатие указателей, учёт ссылок между поколениями в куче, трюки в сгенерированном коде, кэш автобоксинга и т. п. Всё это обильно сдобрим описанием возможных граблей и измерениями производительности.

Historical (e.g. outdated) materials

(RUS) JPoint 2015: Compress Me Tightly


# Performance Optimization 101

Latest in English

(ENG) Slides

Talk Mindmap

Performance optimization has always thought to be a fine art as it could not be easily formalized, or constrained into one solid workflow. However, there are common patterns all performance engineers could follow in their investigations. This session describes some approaches and tools to analyise modern application performance problems in J2SE and hardware.

Latest in Russian

(RUS) Слайды

Хотите сделать ваше приложение быстрее, и для этого оптимизируете Java-код? Мы не будем рассказывать, как оптимизировать Java-программы. Мы не будем рассказывать, как использовать ваш любимый профайлер. В первой части мы расскажем, как делать «правильные вещи» (TM), а не тратить две недели на бесполезные приседания; эти вещи не всегда лежат в самом приложении. Во второй части мы рассмотрим то же самое, применительно к случаю многоядерных машин, разберём типичные казусы с производительностью программ, работающих на больших машинах; опишем их симптомы, а также обсудим типичные подходы к диагностике проблем и их классические решения.

Historical (e.g. outdated) materials

(RUS) JUG.Ru 2012 Video, 451 MB

(RUS) JavaOne Moscow 2012: How To Train Your Dragon: Attack The Scaling on Multicore Machines
Youtube video

(RUS) JavaOne Moscow 2012: Performance Methodology Intro
Youtube video

(RUS) JavaDay SPB 2012: Performance Methodology Intro


# Benchmarking ("Two Timestamps" Story)

Latest in English

(ENG) Slides

This talk includes short versions of "Nanotrusting the Nanotime" and "Java vs. Scala: Divided We Fail" posts.

Performance measurement is easy! Get System.nanoTime() once, get it twice, substract, multiply, divide, stare at the numbers and go for optimizations. Nope! In this talk, we will see how does one uses benchmarks to measure the application performance, what mistakes are usually done in the course of that work, how to avoid those mistakes, and all-in-all how to get any sensible data from the world where everything depends on everything.

We will use Java Microbenchmark Harness (JMH), the standard harness in OpenJDK, in our tutorials.

Latest in Russian

(RUS) Слайды

Хотите сделать ваше приложение быстрее, и для этого оптимизируете Java-код? Мы не будем рассказывать, как оптимизировать Java-программы. Мы не будем рассказывать, как использовать ваш любимый профайлер. В первой части мы расскажем, как делать «правильные вещи» (TM), а не тратить две недели на бесполезные приседания; эти вещи не всегда лежат в самом приложении. Во второй части мы рассмотрим то же самое, применительно к случаю многоядерных машин, разберём типичные казусы с производительностью программ, работающих на больших машинах; опишем их симптомы, а также обсудим типичные подходы к диагностике проблем и их классические решения.

Historical (e.g. outdated) materials

(RUS) JEEConf 2014: Java Benchmarking, Timestamping Failures
Video: JEEConf, Direct: 351 MB

(RUS) JPoint 2014: Java Benchmarking, Timestamping Failures

(RUS) CodeFest 2014: Java Benchmarking


# Benchmarking ("The Lesser of Two Evils" Story)

Latest in English

(ENG) Slides

Measuring the performance is the fine art, and measuring the performance on microbenchmarks is double so. There are multiple caveats one should take a great care of while designing the experiment involving microbenchmarks. The advanced experience with VM technology is required, the exposure with particular nits on exact VM is also a plus.

Some say the benchmarking is inherently evil. We agree with that assertion, but also realize the benchmarking is nevertheless essential, and we need to learn how to benchmark without shooting ourselves in the foot all the time. In this session, we take the crash course in fine microbenchmarking, and introducing OpenJDK's Java Microbenchmark Harness (JMH) along the way.

Latest in Russian

(RUS) Слайды

Доклад про построение корректных (микро)бенчмарков для JVM, учитывая всевозможные грабли, которые нас поджидают от автоматических оптимизаций, особенностей работы рантайма, случайной игры в кости богоподобных существ и прочих жизненных неприятностей. Доклад расширяет и углубляет первый доклад про микробенчмарки, читавшийся в 2009 году. Примеры микробенчмарков показаны на примере JMH — фреймворка, использующегося для тестирования OpenJDK.

Historical (e.g. outdated) materials

(ENG) Oredev 2013: (The Art of) (Java) Benchmarking
Video: Vimeo, Direct: 188 MB

(ENG) JVMLS 2013: JVM Benchmarking
Video: OTN, Direct: 968 MB

(ENG) JavaOne SF 2011: (The Art of) (Java) Benchmarking

(RUS) JavaDay Kiev 2011: (The Art of) (Java) Benchmarking

(RUS) JavaOne Moscow 2011: (The Art of) (Java) Benchmarking


# Java Concurrency Stress Tests

Latest in English

No video.

(ENG) JVMLS 2013: Breaking Concurrency Bad, or jcstress

A very short lightning talk.

Latest in Russian

(RUS) Слайды

Доклад про опыт тестирования concurrency в JDK/JVM, разного рода загадки и примеры как оптимизации и дефекты в реализации виртуальной машины и библиотек ломают модель памяти, и что нам с этим делать. Доклад *требует* знания JMM, понимания внутренней работы JRE, и устройства железа.

Historical (e.g. outdated) materials

(RUS) JEEConf 2013: Java Concurrency, Battle for Correctness
Video: JEEConf, Direct: 414 MB

(RUS) JavaOne Russia 2013: Bullet-Proof Java Concurrency
Video (courtesy of JPoint): YouTube, Direct: 431 MB


# Fork/Join

Latest in Russian

(RUS) Слайды

В JDK 7 появилась поддержка параллельных операций, ложащихся в модель Fork/Join. Этот доклад рассматривает особенности реализации ForkJoinPool, явные ограничения и подводные камни, а также следующие из них правильные и неправильные модели использования новой функциональности.

Historical (e.g. outdated) materials

(RUS) JEEConf 2013: Fork/Join

(RUS) JUG.Ru (Spb): Fork/Join
Video: YouTube, Direct: 889 MB

(RUS) JEEConf 2012: Fork/Join
Video: Yandex

(RUS) JavaOne Moscow 2012: Fork/Join
Video: Youtube


# Java Object Layout

Latest in Russian

(RUS) Слайды

JOL

JOL Samples

Программисты — как дети, всегда пытаются разломать свои любимые игрушки, чтобы понять, как же те работают. Некоторым детям, правда, действительно нужно знать, сколько лишних деталек напихали туда глупые конструкторы. Для возмужавших детей — этот доклад.

Возмужавшие дети (tm) обычно берут в руки heap dump и начинают ковыряться в нём отвёрточкой. Но heap dump — это так же надёжно, как информация, выбитая из пленного партизана. Он «сдаст» вам координаты аэродрома с кукурузниками, а найдёте вы там пустое кукурузное поле.

Нам нужно взять объекты тёпленькими прямо в рабочей JVM, где они живут своей подпольной жизнью. Только так мы сможем в деталях рассмотреть, как разложены поля, как разложены объекты в памяти, как их связи влияют на укладку, как и когда они меняют места дислокации, пуская пыль в глаза честным разработчикам.

Очная ставка с захваченными за линией фронта объектами гарантируется!

Historical (e.g. outdated) materials

(RUS) Joker 2013: What Heap Dumps Are Lying To You About
Video: Youtube, Direct: 497 MB
Collaterals: JOL, JOL Samples


# JDK 8, Lambdas

Latest in Russian

(RUS) JUG.Ru (SPb): Per Aspera Ad Lambdas

Самым существенным со времен Java 5 изменением языка станет поддержка лямбда-выражений в Java 8. Эта встреча посвящена техническим аспектам Project Lambda, рассказу о ситуации «изнутри».

Речь пойдёт:

  1. Про лямбды: что такое лямбды в контексте Java; как они соотносятся с существующими примитивами языка; лямбды — сахар или нет; как jsr292 победил javac; сколько, где, и кому стоят лямбды; плюшки, грабли, и прочие особенности;
  2. Про stream (bulk) операции: что это такое, и с чем их едят; при чём тут Fork/Join; сколько и где стоит их использование; пышки, шишки, и прочие характерные свойства;
  3. Про defender (default) методы: что это такое, зачем нужны; чем всё-таки отличается абстрактный класс от интерфейса; прочие весёлые неурядицы

Historical (e.g. may be outdated) materials

(ENG) JavaDay Riga 2013: JDK 8: Stream Style
(hosted for Sergey Kuksenko)

(RUS) JEEConf 2013: JDK 8: Lambda Malleus
(modified by Sergey Kuksenko)

(RUS) JavaOne Russia 2013, JDK 8: Lambda Malleus

(RUS) JEEConf 2013: JDK 8: I, Lambda
(hosted for Sergey Kuksenko)

(RUS) JavaOne Russia 2013, JDK 8: I, Lambda
(hosted for Sergey Kuksenko)


# Quantum Performance Effects

(ENG) JavaDay Riga 2013: "Quantum" Performance Effects
(hosted for Sergey Kuksenko)

(RUS) JavaOne Russia 2013: "Quantum" Performance Effects
(hosted for Sergey Kuksenko)
Video (courtesy of JPoint): YouTube, high quality (514 MB)


# Java Platform Performance BOF

(RUS) JEEConf 2011: Java Platform Performance BoF

(RUS) JavaOne Moscow 2011: Java Platform Performance BoF

(RUS) JavaTechDay SPB, 2011: Java Platform Performance BoF


# Assorted

(ENG) JVMLS 2013: False Sharing, and @Contended

(ENG) JavaOne SF 2011: Java or C++, Practical Advice You Can Use
(co-presenter with Sergey Kuksenko and Charlie Hunt)
Video: Parleys


Papers


(ENG) SPECjbb2012: Updated Metrics for a Business Benchmark @ ACM/ICPE, Boston, April 22-25, USA

Projects

Apache Harmony
   Open-source implementation of Java 5 under APLv2.
   Parts of Harmony's class libraries are now parts of Android.
   Retired.

OpenJDK
   Open-source, Oracle-endorsed implementation of Java 8 under GPLv2 with CP exception.
   The most used Java runtime in the world.

Java Microbenchmark Harness (jmh)
   The microbenchmark harness used to drive most of our performance experiments.

Java Concurrency Stress Tests (jcstress)
   The harness and the set of functional tests to break Java implementations on concurrency front.

Java Object Layout (jol)
   The minimalistic tool box for field/object layout stuides.

Other projects on GitHub

Non-techical articles and toy projects


(ENG) XKCD-1110 full-view

(RUS) President Elections in Russia, 2012 (round 1): Data robots, and parsed data

(RUS) President Elections in Russia, 2012: Twitter dumps, and spamfiltering

(RUS) Parliament Elections in Russia, 2011: Data robots, and parsed data
Яндекс.Метрика