Алексей Рагозин — Новые и старые возможности Java Flight Recorder в OpenJDK 11

3fc5b5eb32bd3b48d7810fd67b37f9a1?s=47 Moscow JUG
December 12, 2019

Алексей Рагозин — Новые и старые возможности Java Flight Recorder в OpenJDK 11

Мастер-класс: Новые и старые возможности Java Flight Recorder в OpenJDK 11

Java Flight Recoder — мощный инструмент профилирования и диагностики
встроенный в JVM.

В промежутке между JDK 8 и JDK 11 Java Flight Recorder претерпел ряд
серьёзных изменений. Поменялась лицензия, очень сильно поменялись API
и формат файлов.

Mission Control — основной инструмент для работы с дампами Flight
Recorder, так же претерпел серьёзные изменения и получил Open Source
лицензию.

Разумеется, помимо технических изменений, в новом Flight Recorder
появились и новые, долгожданные возможности.
В рамках мастер класса будут показаны основные возможности Java Flight
Recorder и Mission Control 7.0.

Приносите с собой ноутбуки, чтобы максимально плодотворно провести время.

Участникам мастер-класса потребуется следующее ПО
- OpenJDK 11
- Mission Control 7.0
- Apache Maven 3.6
- git

3fc5b5eb32bd3b48d7810fd67b37f9a1?s=128

Moscow JUG

December 12, 2019
Tweet

Transcript

  1. Новые и старые возможности Java Flight Recorder в OpenJDK 11

    alexey.ragozin@gmail.com Алексей Рагозин Москва, Декабрь 2019
  2. Java would never be the same Java 8 Java 11

  3. Задачи профилирования Сэмплирование Трассировка Анализ дампов кучи JIT Компиляция Safepoints

    Native Memory Tracking CPU потоков Поиск “горячего” кода JMX Консоль JVM Internals JVM GC Анализ и тюнинг Сэмплинг сайтов аллокации Сэмплинг статистики по классам Профилирование аллокации Анализ памяти
  4. Java 8, инструменты JDK  Консольные команды – jcmd, jstack,

    etc  Visual VM • JMX консоль • Профайлер • Браузер хип дампов  Mission Control 5.5 • JMX консоль • Java Flight Recorder UI
  5. Задачи профилирования Сэмплирование Трассировка Анализ дампов кучи JIT Компиляция Safepoints

    Native Memory Tracking CPU потоков Поиск “горячего” кода JMX Консоль JVM Internals JVM GC Анализ и тюнинг Сэмплинг сайтов аллокации Сэмплинг статистики по классам Профилирование аллокации Анализ памяти
  6. Java 11  Консольные команды – jcmd, jstack, etc 

    Visual VM - https://visualvm.github.io/  Mission Control 7 - https://bell-sw.com/pages/lmc/  GC Viewer - https://github.com/chewiebug/GCViewer  SJK - https://github.com/aragozin/jvm-tools
  7. Java 11, консольные инструменты Рантайм jcmd  Хип дамп 

    Дамп потоков  Настройки JVM  Активация JMX  … и прочее Постмортем jhsdb  Хип дамп  Дамп потоков  Настройки JVM
  8. JVM configuration details jcmd <PID> VM.command_line jcmd <PID> VM.version jcmd

    <PID> VM.system_properties jinfo -sysprops <PID> or jcmd <PID> VM.flags jinfo -flags <PID> or On fly JMX port configuration Start listening to JMX on specified port jcmd <PID> ManagementAgent.start jmxremote.authenticate=false jmxremote.host=<HOST> jmxremote.port=<PORT> jmxremote.rmi.port=<PORT> jmxremote.ssl=false See more details on https://docs.oracle.com/javase/8/docs/ technotes/guides/management/agent.html Stop listening to JMX jcmd <PID> ManagementAgent.stop -Djava.rmi.server.hostname=<HOST> If port is not working with remote connection or SSH port forwarding, you may need to add following options to JVM startup (cannot be applied on running JMV). Use 127.0.0.1 as host if you plan to use SSH port forwarding On fly modify -XX JVM options Only sub set of options could be changed at runtime. You can use command below to list them. jcmd <PID> VM.set_flag PrintGC true jinfo -flag PrintGC=1 <PID> or jcmd <PID> VM.flags -all | grep manageable GC Runtime control jcmd <PID> GC.rotate_log jcmd <PID> GC.run System.gc() jcmd <PID> GC.run_finalization System.runFinalization() jmap -histo:live <PID> FullGC as side effect JVM heap information jmap -heap <PID> jstat -gc <PID> -gc[meta|new|old]capacity -gccapacity -gccause -gcutil Alternative gc related options jstat aberations E* – Eden S0* – Survivor 0 O*|OG* – Old space CCS* – Compressed class space M*|MC* – Metaspace YGC|FGC – Youg|Full GC count YGCT|FGCT – Youg|Full GC cumulative time Java Flight Recorder control jcmd <PID> VM.unlock_commercial_features or use -XX:+UnlockCommercialFeatures on start jcmd <PID> JFR.start jcmd <PID> JFR.start settings=profile jcmd <PID> JFR.start settings=/path_to/jfr.xml jcmd <PID> JFR.check Show active recordings jcmd <PID> JFR.dump recording=1 filename=dump.jfr jcmd <PID> JFR.stop recording=1 Use absolute path. Relative path is calcurated from JRE/lib/jfr Dump is created relative to target JVM working directory jcmd <PID> help JFR.start See more options available for Flight Recorder via help Thread dump jcmd <PID> Thread.print jstack <PID> jcmd <PID> Thread.print -l or jstack -l <PID> or Display lock information in stack trace jstack -m <PID> Display both native and Java stack frames Buggy, requires JVM debug symbols Heap dump / Class histogram jcmd <PID> GC.class_histogram [-all] jmap -histo[:live] <PID> or “live” option is forcing Full GC before heap inspection, “-all” does opposite Class histogram jcmd <PID> GC.heap_dump filename=dump.hprof [-all] jmap -dump:file=dump.hprof[,live] <PID> or Heap dump Class / compiler statistic jstat -printcompilation <PID> jstat -compiler <PID> jstat -class <PID> Native memory tracking -XX:NativeMemoryTracking=[summary|detail] Native memory tracking should be enabled on startup jcmd <PID> VM.native_memory [detail=true] Native memory tracking may not track memory allocated via C runtime (e.g. zlib) -XX:+PreserveFramePointer Better use with Command can be used with JVM core dump. These command also have -F option to deal with unresponsive JVM. Alexey Ragozin – http://blog.ragozin.info JDK command line tools cheatsheet Java 8 alexey.ragozin@gmail.com https://training.ragozin.info/collateral/JDK_tools_cheatsheet.pdf
  9. Java Flight Recorder  Диагностика встроена в JVM  Низкие

    накладные расходы  Бинарный формат лога событий (JFR файлы)  Mission Control фроненд для работы с файлами Java 8 – не Open Source, использование ограничено Java 11 – Open Source, доступен в OpenJDK
  10. System properties Configuration JVM Flags Heap & Garbage collection GC

    Events & Timings Allocation sampling Code execution Stack trace sampling Exception tracing IO & Contention Java Mission Control 5.5 Timeline of all events per thread blog.ragozin.info Navigation cheatsheet
  11. Новое в Java Flight Recorder  Новый бинарный и логический

    формат  Java API для работы с JFR файлами  Java API для публикации событий  Новый события и фиксы старых • Запись использование CPU по потокам • Сэмплирование потоков в нативном коде • Сэмплирования старых объектов (поиск утечек)  Удалённый доступ (JMX) к JFR  Новый UI - Mission Control 7
  12. Java Flight Recorder, режимы  Запуск на старте JVM, через

    параметры запуска  Запуск через jcmd  Запуск удалённо через JMX  Несколько параллельных сессий сбора данных с разными параметрами  Настройка ротации и вытеснения событий  Удалённый доступ к логам Flight Recorder
  13. Сэмплирование потоков Task.run() wait() process() getBody() read() parse() handle() load()

    read() Time encode() wait() process() getBody() read() parse() handle() load() read() encode() wait() process() getBody() read() parse() handle() encode() 10 Task.run 7 3 process() 4 handle() 3 encode() 2 ... 1 ... 1 load() geBody() 2 1 read() parse() 1 3 wait() ...
  14. Flame graph Task.run() wait() process() getBody() read() parse() handle() load()

    read() Time encode() wait() process() getBody() read() parse() handle() load() read() encode() wait() process() getBody() read() parse() handle() encode() SJK - https://github.com/aragozin/jvm-tools Task.run() process() wait() getBody() handle() read() parse() dicLookup() load() encode() fixEncode() digest() digestSHA256() writeUtf() flush()
  15. Allocation Sampling Instrumentation – Normal Profilers  Instrument every new

    instruction  Expensive!  Interfere JVM optimizations Flight Recorder  Fast path – Object allocated from TLAB  Slow path – new TLAB have to be allocated  Sample on slow path (every few hundreds of kB)  Non uniform sampling (TLAB size is dynamic) Sampled
  16. Method Sampling Bias Problem – Frequent JNI calls into InflaterInputStream

    Java Flight Recorder SJK (JMX sampling) perf * * https://github.com/jvm-profiling-tools/perf-map-agent Total samples 5653 100.00% ZIP 2659 47.04% Other 2994 52.96% Total samples 2905 100.00% ZIP 2870 98.80% Other 35 1.20% Total samples 59896 100.00% ZIP 54771 91.44% Other 5125 8.56%
  17. Заключение • Инструменты нужно качать самому  • Новые Visual

    VM и Mission Control с нами • Java Flight Recorder – часть OpenJDK • Много новых фишек в jcmd
  18. Спасибо! Алексей Рагозин alexey.ragozin@gmail.com https://blog.ragozin.info Вебинары и прочие мероприятия по

    теме Java Ops https://aragozin.timepad.ru/