Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Moscow JUG

December 12, 2019
Tweet

More Decks by Moscow JUG

Other Decks in Programming

Transcript

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

    View Slide

  2. Java would never be the same
    Java 8 Java 11

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  8. 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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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%

    View Slide

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

    View Slide

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

    View Slide