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

Javaの起動時間といかに戦うか / How to fight against Java warmup time

Javaの起動時間といかに戦うか / How to fight against Java warmup time

2019/11/23に開催されたJJUG CCC 2019 Fallでの登壇資料です

Naoki Kishida

November 23, 2019
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

  1. Java


    2019/11/23 JJUG CCC 2019 Fall
    LINE Fukoka

    View Slide



  2. • LINE Fukuoka
    • @kis
    • Hatena (nowokay.hatenablog.com)

    View Slide


  3. • # "!' &
    • Java#
    • #

    • Java 14 $
    %

    View Slide


  4. • # "!' &
    • Java#
    • #

    • Java 14 $
    %

    View Slide



  5. • $'#
    :8"
    @)74.
    • /6$'#
    "&
    2
    • ,>
    ;(*8
    • "0B<
    • % !15
    ?+
    • -=9<3A

    View Slide


  6. • # "!' &
    • Java#
    • #

    • Java 14 $
    %

    View Slide

  7. Java
    • JVM






    (JIT)
    Java
    Bytecode
    loading
    class
    interpret profile
    generate
    native code
    internal
    expression
    profile
    data
    native
    code
    Execute
    on CPU

    View Slide


  8. • # "!' &
    • Java#
    • #

    • Java 14 $
    %

    View Slide





  9. • JIT
    • JIT


    View Slide






  10. or


    • OpenJDK CDS(Class Data Sharing)
    Java
    Bytecode
    loading
    class
    interpret profile
    generate
    native code
    internal
    expression
    profile
    data
    native
    code
    Execute
    on CPU
    !

    View Slide

  11. Class Data Sharing
    • Java 5 Bootstrap CDS
    • Java 10 App CDS(JEP 310)
    • %
    • Java 12 Default CDS(JEP 341)
    • Bootstrap CDS &(


    '$
    • Java 13 Dynamic CDS(JEP 350)
    • ! CDS#"

    View Slide

  12. JIT




    JVM

    • Alibaba Dragonwell - JWarmup
    Java
    Bytecode
    loading
    class
    interpret profile
    generate
    native code
    internal
    expression
    profile
    data
    native
    code
    Execute
    on CPU

    View Slide

  13. JIT
    • JIT
    JVM

    • OpenJ9
    • Azul Zing - Falcon JIT
    Java
    Bytecode
    loading
    class
    interpret profile
    generate
    native code
    internal
    expression
    profile
    data
    native
    code
    Execute
    on CPU

    View Slide

  14. JIT
    • JITJIT

    • OpenJ9
    • JIT as a Service(JITaaS)
    • https://www.youtube.com/watch?v=gx8DVVFPkcQ

    View Slide



  15. • AOT(Ahead of Time compile)
    • Java



    • GraalVM native image
    • Java 9 AOT (JEP 295)
    Point to
    analysis
    Java
    Bytecode
    loading
    class
    generate
    native code
    internal
    expression
    native
    code
    Execute
    on CPU

    Run
    initialization
    Heap
    snapshot

    View Slide

  16. JITAOT
    JIT AOT

    $


    #!
    "


    CPU &%'

    View Slide

  17. AOT

    • JIT
    AOT
    Java
    Bytecode
    loading
    class
    interpret profile
    generate
    native code
    internal
    expression
    profile
    data
    native
    code
    Execute
    on CPU
    Point to
    analysis
    Java
    Bytecode
    loading
    class
    generate
    native code
    internal
    expression
    native
    code
    Execute
    on CPU
    Run
    initialization
    Heap
    snapshot

    View Slide

  18. profile guided optimization
    • GraalVM EEJIT

    native-image

    View Slide


  19. • # "!' &
    • Java#
    • #

    • Java 14 $
    %

    View Slide


  20. • OpenJDK

    • HotSpot JDK

    • GraalVM

    View Slide

  21. Micronaut

    • Micronaut
    • Micronaut
    main
    main

    System.out.println(ManagementFactory.getRuntimeMXBean().getUptime());

    View Slide

  22. OpenJDK

    • Java 8Java 13
    • CDS
    • AOT

    • Compact String


    View Slide

  23. Java8Java13
    • Java 13
    0
    200
    400
    600
    800
    1000
    1200
    1400
    Java 8 Java 13
    VM

    View Slide

  24. CDS
    • Java 12Default CDSCDS

    • 13 Default CDSJava 13
    0
    200
    400
    600
    800
    1000
    1200
    1400
    Java 8 13 No CDS 13 Default
    CDS
    13 Dynamic
    CDS
    13 App CDS
    VM

    View Slide

  25. HotSpotJDK
    • OpenJ9JIT
    • GragonwellMac Linux
    JWarmup

    • Azul Zing !
    0
    200
    400
    600
    800
    1000
    1200
    1400
    Java 8 Java 13 13 App CDS OpenJ9 OpenJ9 JIT Cache
    VM

    View Slide

  26. GraalVM native image
    • native image
    0
    200
    400
    600
    800
    1000
    1200
    1400
    Java 8 Java 13 13 App CDS native image
    VM

    View Slide

  27. native image




    0
    5
    10
    15
    20
    25
    30
    35
    40
    45
    Java 8 Java 13 CE JIT EE JIT CE AOT EE AOT

    View Slide

  28. profile guided optimization


    0
    5
    10
    15
    20
    25
    30
    35
    40
    45
    Java 8 Java 13 CE JIT EE JIT CE AOT EE AOT PGO

    View Slide



  29. • App CDS

    • native-image
    0
    50
    100
    150
    200
    250
    300
    350
    Java 8 Java 13 13 App CDS OpenJ9 JIT
    Cache
    GraalVM JIT GraalVM AOT

    View Slide


  30. • # "!' &
    • Java#
    • #

    • Java 14 $
    %

    View Slide

  31. Java 14


    • static final
    • GraalVM JIT

    • JWarmup

    View Slide

  32. static final


    • https://openjdk.java.net/jeps/8209964
    • ↓


    private final static Logger LOGGER = Logger.getLogger("com.foo.Bar");

    View Slide

  33. Graal JIT

    • https://openjdk.java.net/jeps/8223220
    • OpenJDK Graal JIT Java


    JIT#%
    • "
    • native-image
    shared library!$
    0
    500
    1000
    1500
    2000
    Java 8 Java 13 13 + Graal
    VM" "
    0
    50
    100
    150
    200
    Java 8 Java 13 13 + Graal

    View Slide

  34. JWarmup
    • https://openjdk.java.net/jeps/8203832
    • GragonwellJWarmupOpenJDK

    View Slide