Slide 1

Slide 1 text

Java    2019/11/23 JJUG CCC 2019 Fall LINE Fukoka  

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

 • # "!' & • Java # • #  •  • Java 14 $   %

Slide 4

Slide 4 text

 • # "!' & • Java # • #  •  • Java 14 $   %

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

 • # "!' & • Java # • #  •  • Java 14 $   %

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

 • # "!' & • Java # • #  •  • Java 14 $   %

Slide 9

Slide 9 text

   •      • JIT    • JIT  •   

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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#"

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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 

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

   • 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

Slide 16

Slide 16 text

JITAOT JIT AOT   $      #! "      CPU &%'

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

profile guided optimization • GraalVM EEJIT   native-image

Slide 19

Slide 19 text

 • # "!' & • Java # • #  •  • Java 14 $   %

Slide 20

Slide 20 text

 • OpenJDK • HotSpot JDK  • GraalVM 

Slide 21

Slide 21 text

Micronaut • Micronaut   • Micronaut main    main    ↓ System.out.println(ManagementFactory.getRuntimeMXBean().getUptime());

Slide 22

Slide 22 text

OpenJDK   • Java 8 Java 13 • CDS • AOT •    • Compact String  •    

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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 

Slide 25

Slide 25 text

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 

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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 

Slide 29

Slide 29 text

 • 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 

Slide 30

Slide 30 text

 • # "!' & • Java # • #  •  • Java 14 $   %

Slide 31

Slide 31 text

Java 14   • static final   • GraalVM JIT   • JWarmup

Slide 32

Slide 32 text

static final     • https://openjdk.java.net/jeps/8209964 •  ↓ •       private final static Logger LOGGER = Logger.getLogger("com.foo.Bar");

Slide 33

Slide 33 text

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 

Slide 34

Slide 34 text

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