Slide 1

Slide 1 text

Новые и старые возможности Java Flight Recorder в OpenJDK 11 [email protected] Алексей Рагозин Москва, Декабрь 2019

Slide 2

Slide 2 text

Java would never be the same Java 8 Java 11

Slide 3

Slide 3 text

Задачи профилирования Сэмплирование Трассировка Анализ дампов кучи JIT Компиляция Safepoints Native Memory Tracking CPU потоков Поиск “горячего” кода JMX Консоль JVM Internals JVM GC Анализ и тюнинг Сэмплинг сайтов аллокации Сэмплинг статистики по классам Профилирование аллокации Анализ памяти

Slide 4

Slide 4 text

Java 8, инструменты JDK  Консольные команды – jcmd, jstack, etc  Visual VM • JMX консоль • Профайлер • Браузер хип дампов  Mission Control 5.5 • JMX консоль • Java Flight Recorder UI

Slide 5

Slide 5 text

Задачи профилирования Сэмплирование Трассировка Анализ дампов кучи JIT Компиляция Safepoints Native Memory Tracking CPU потоков Поиск “горячего” кода JMX Консоль JVM Internals JVM GC Анализ и тюнинг Сэмплинг сайтов аллокации Сэмплинг статистики по классам Профилирование аллокации Анализ памяти

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Java 11, консольные инструменты Рантайм jcmd  Хип дамп  Дамп потоков  Настройки JVM  Активация JMX  … и прочее Постмортем jhsdb  Хип дамп  Дамп потоков  Настройки JVM

Slide 8

Slide 8 text

JVM configuration details jcmd VM.command_line jcmd VM.version jcmd VM.system_properties jinfo -sysprops or jcmd VM.flags jinfo -flags or On fly JMX port configuration Start listening to JMX on specified port jcmd ManagementAgent.start jmxremote.authenticate=false jmxremote.host= jmxremote.port= jmxremote.rmi.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 ManagementAgent.stop -Djava.rmi.server.hostname= 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 VM.set_flag PrintGC true jinfo -flag PrintGC=1 or jcmd VM.flags -all | grep manageable GC Runtime control jcmd GC.rotate_log jcmd GC.run System.gc() jcmd GC.run_finalization System.runFinalization() jmap -histo:live FullGC as side effect JVM heap information jmap -heap jstat -gc -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 VM.unlock_commercial_features or use -XX:+UnlockCommercialFeatures on start jcmd JFR.start jcmd JFR.start settings=profile jcmd JFR.start settings=/path_to/jfr.xml jcmd JFR.check Show active recordings jcmd JFR.dump recording=1 filename=dump.jfr jcmd 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 help JFR.start See more options available for Flight Recorder via help Thread dump jcmd Thread.print jstack jcmd Thread.print -l or jstack -l or Display lock information in stack trace jstack -m Display both native and Java stack frames Buggy, requires JVM debug symbols Heap dump / Class histogram jcmd GC.class_histogram [-all] jmap -histo[:live] or “live” option is forcing Full GC before heap inspection, “-all” does opposite Class histogram jcmd GC.heap_dump filename=dump.hprof [-all] jmap -dump:file=dump.hprof[,live] or Heap dump Class / compiler statistic jstat -printcompilation jstat -compiler jstat -class Native memory tracking -XX:NativeMemoryTracking=[summary|detail] Native memory tracking should be enabled on startup jcmd 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 [email protected] https://training.ragozin.info/collateral/JDK_tools_cheatsheet.pdf

Slide 9

Slide 9 text

Java Flight Recorder  Диагностика встроена в JVM  Низкие накладные расходы  Бинарный формат лога событий (JFR файлы)  Mission Control фроненд для работы с файлами Java 8 – не Open Source, использование ограничено Java 11 – Open Source, доступен в OpenJDK

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Java Flight Recorder, режимы  Запуск на старте JVM, через параметры запуска  Запуск через jcmd  Запуск удалённо через JMX  Несколько параллельных сессий сбора данных с разными параметрами  Настройка ротации и вытеснения событий  Удалённый доступ к логам Flight Recorder

Slide 13

Slide 13 text

Сэмплирование потоков 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() ...

Slide 14

Slide 14 text

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()

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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%

Slide 17

Slide 17 text

Заключение • Инструменты нужно качать самому  • Новые Visual VM и Mission Control с нами • Java Flight Recorder – часть OpenJDK • Много новых фишек в jcmd

Slide 18

Slide 18 text

Спасибо! Алексей Рагозин [email protected] https://blog.ragozin.info Вебинары и прочие мероприятия по теме Java Ops https://aragozin.timepad.ru/