Q U A R K U S & G R A A L V M Q U A R K U S & G R A A L - - PowerPoint PPT Presentation

q u a r k u s g r a a l v m q u a r k u s g r a a l v m
SMART_READER_LITE
LIVE PREVIEW

Q U A R K U S & G R A A L V M Q U A R K U S & G R A A L - - PowerPoint PPT Presentation

Q U A R K U S & G R A A L V M Q U A R K U S & G R A A L V M booting Hibernate at supersonic speed, subatomic size @SanneGrinovero S A N N E G R I N O V E R O S A N N E G R I N O V E R O Dutch, Italian, now in London. S A N N E


slide-1
SLIDE 1

Q U A R K U S & G R A A L V M Q U A R K U S & G R A A L V M

booting Hibernate at supersonic speed, subatomic size @SanneGrinovero

slide-2
SLIDE 2

S A N N E G R I N O V E R O S A N N E G R I N O V E R O

Dutch, Italian, now in London.

slide-3
SLIDE 3

S A N N E G R I N O V E R O S A N N E G R I N O V E R O

Dutch, Italian, now in London. Red Hat : Middleware R&D

  • Hibernate team lead

Quarkus, engineering team

slide-4
SLIDE 4

S A N N E G R I N O V E R O S A N N E G R I N O V E R O

Dutch, Italian, now in London. Red Hat : Middleware R&D

  • Hibernate team lead

Quarkus, engineering team

Also contributing to:

  • GraalVM, OpenJDK, WildFly, Apache Lucene,

Infinispan, Elasticsearch, JGroups, Byteman, Maven, Gradle, PostgreSQL, JakartaEE, Thorntail, ANTLR, Asciidoctor, ...

slide-5
SLIDE 5

A G E N D A A G E N D A

GraalVM & native images

  • Quarkus
  • Joy of live coding
  • How ?!?
slide-6
SLIDE 6

N A T I V E I M A G E ? N A T I V E I M A G E ?

slide-7
SLIDE 7

L E T ' S S E E O N E I N L E T ' S S E E O N E I N A C T I O N . . . A C T I O N . . .

$ export GRAALVM_HOME= //path to your GraalVM download, unpacked $ export JAVA_HOME=$GRAALVM_HOME $ mvn package $ native-image -jar main.jar $ ./main

slide-8
SLIDE 8

I N T E R E S T I N G . . . I N T E R E S T I N G . . .

How about more complex apps?

slide-9
SLIDE 9
slide-10
SLIDE 10

used by Quarkus

slide-11
SLIDE 11

A o T c o m p i l a t i o n w i t h G r a a l V M A o T c o m p i l a t i o n w i t h G r a a l V M

Application classes JDK API classes SubstrateVM classes Staticaly linked executable

slide-12
SLIDE 12

A o T c o m p i l a t i o n w i t h G r a a l V M A o T c o m p i l a t i o n w i t h G r a a l V M

Static analysis

  • Closed world assumption
  • Dead code elimination:

classes, fields, methods, branches

slide-13
SLIDE 13

L I M I T A T I O N S L I M I T A T I O N S

O F G R A A L V M N A T I V E O F G R A A L V M N A T I V E I M A G E S I M A G E S

slide-14
SLIDE 14

D Y N A M I N C D Y N A M I N C C L A S S L O A D I N G C L A S S L O A D I N G

slide-15
SLIDE 15

D Y N A M I N C D Y N A M I N C C L A S S L O A D I N G C L A S S L O A D I N G

Deloying jars, wars, etc. at runtime impossible

slide-16
SLIDE 16

J V M T I , J M X J V M T I , J M X

+ other native VM interfaces

slide-17
SLIDE 17

J V M T I , J M X J V M T I , J M X

+ other native VM interfaces No agents

slide-18
SLIDE 18

J V M T I , J M X J V M T I , J M X

+ other native VM interfaces No agents JRebel, Byteman, profilers, tracers, ...

slide-19
SLIDE 19

J V M T I , J M X J V M T I , J M X

+ other native VM interfaces No agents JRebel, Byteman, profilers, tracers, ... No Java Debugger

slide-20
SLIDE 20

M I S C E L L A N E O U S M I S C E L L A N E O U S

No: Security Manager No: finalize() (deprecated anyway) Limited: InvokeDynamic and MethodHandles

slide-21
SLIDE 21

R E F L E C T I O N R E F L E C T I O N

Requires registration via native-image CLI/API

! limited

slide-22
SLIDE 22

M O R E . . . M O R E . . .

Need to register in advance also:

! limited

Dynamic proxies

  • Resources being loaded
  • JNI, Unsafe Memory Access, ...
slide-23
SLIDE 23

S T A T I C I N I T S T A T I C I N I T

Attempts to run them at build time

Very special

slide-24
SLIDE 24

S T A T I C I N I T S T A T I C I N I T

Attempts to run them at build time

Very special

Resolve classes, run "safe" static initializers

slide-25
SLIDE 25

S T A T I C I N I T S T A T I C I N I T

Attempts to run them at build time

Very special

Resolve classes, run "safe" static initializers

  • Take a snapshot of the produced instances -

prune the unreachable ones

slide-26
SLIDE 26

S T A T I C I N I T S T A T I C I N I T

Attempts to run them at build time

Very special

Resolve classes, run "safe" static initializers

  • Take a snapshot of the produced instances -

prune the unreachable ones

  • Include them in the executable
slide-27
SLIDE 27

S T A T I C I N I T S T A T I C I N I T

Very special

not allowed: file handles, sockets, threads

  • careful with other state: timestamps, system

dependent constants, capturing environment variables, etc..

slide-28
SLIDE 28

H O W D O Y O U D I S A B L E A H O W D O Y O U D I S A B L E A F E A T U R E A N Y W A Y ? F E A T U R E A N Y W A Y ?

slide-29
SLIDE 29

H O W D O Y O U D I S A B L E A H O W D O Y O U D I S A B L E A F E A T U R E A N Y W A Y ? F E A T U R E A N Y W A Y ?

boolean jmxEnabled = parseConfiguration(...); if (jmxEnabled) { registerJMX(); }

slide-30
SLIDE 30

H O W D O Y O U D I S A B L E A H O W D O Y O U D I S A B L E A F E A T U R E A N Y W A Y ? F E A T U R E A N Y W A Y ?

boolean jmxEnabled = parseConfiguration(...); if (jmxEnabled) { registerJMX(); } static final JMX_ENABLED = false; if (JMX_ENABLED) { registerJMX(); }

slide-31
SLIDE 31

O K L E T ' S A D A P T M Y O K L E T ' S A D A P T M Y C O D E . . . C O D E . . .

slide-32
SLIDE 32

O K L E T ' S A D A P T M Y O K L E T ' S A D A P T M Y C O D E . . . C O D E . . .

All your dependencies need to get compiled too!

slide-33
SLIDE 33

O K L E T ' S A D A P T M Y O K L E T ' S A D A P T M Y C O D E . . . C O D E . . .

All your dependencies need to get compiled too! ALL DEPENDENCIES

slide-34
SLIDE 34

I M P A C T O N H I B E R N A T E I M P A C T O N H I B E R N A T E O R M ? O R M ?

slide-35
SLIDE 35

I M P A C T O N H I B E R N A T E I M P A C T O N H I B E R N A T E O R M ? O R M ?

Mindmap #3

slide-36
SLIDE 36

W H A T I S Q U A R K U S W H A T I S Q U A R K U S

slide-37
SLIDE 37

T O O L K I T T O O L K I T

and

F R A M E W O R K F R A M E W O R K

for writing Java applications

slide-38
SLIDE 38

T O O L K I T T O O L K I T

and

F R A M E W O R K F R A M E W O R K

for writing Java1 applications

1) and Kotlin

slide-39
SLIDE 39

L I G H T , C L O U D F R I E N D L Y , L I G H T , C L O U D F R I E N D L Y , D E S I G N E D F O R G R A A L V M D E S I G N E D F O R G R A A L V M

Helps overcome limitations of GraalVM Embraces them!

slide-40
SLIDE 40

*.class QUARKUS

  • ptimized jar

native executable JVM

Maven/Gradle plugin

slide-41
SLIDE 41

E X T E N S I O N S E X T E N S I O N S

Each Java library gets a Quarkus extension Makes it compatible with GraalVM native-images And makes it much lighter to run on JVM

slide-42
SLIDE 42

L I B R A R I E S Y O U A L R E A D Y K N O W L I B R A R I E S Y O U A L R E A D Y K N O W

ECLIPSE VERT.X HIBERNATE RESTEASY APACHE CAMEL NETTY KUBERNETES JAEGER PROMETHEUS APACHE KAFKA INFINISPAN

slide-43
SLIDE 43

Unifies

I M P E R A T I V E I M P E R A T I V E

and R E A C T I V E

R E A C T I V E

@Inject SayService say; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return say.hello(); } @Inject @Stream("kafka") Publisher<String> reactiveSay @GET @Produces(MediaType.SERVER_SEN public Publisher<String> stre return reactiveSay; }

slide-44
SLIDE 44

C O N T A I N E R F I R S T C O N T A I N E R F I R S T

slide-45
SLIDE 45

C O N T A I N E R F I R S T C O N T A I N E R F I R S T

Small size on disk Small container images 💿 ✓

slide-46
SLIDE 46

C O N T A I N E R F I R S T C O N T A I N E R F I R S T

Small size on disk Small container images Fast boot time Instant scale up 💿 ✓ 🚁 ✓

slide-47
SLIDE 47

C O N T A I N E R F I R S T C O N T A I N E R F I R S T

Small size on disk Small container images Fast boot time Instant scale up Low RSS1 memory

1) Resident Set Size

More containers with the same RAM 💿 ✓ 🚁 ✓ 🔭 ✓

slide-48
SLIDE 48

M E A S U R I N G M E M O R Y M E A S U R I N G M E M O R Y

= all RAM consumed by the process RSS

$ ps -o pid,rss,command -p $(pgrep quarkus) PID RSS COMMAND 11229 12628 ./target/quarkus-hello

slide-49
SLIDE 49

M E M O R Y ( R S S ) M E M O R Y ( R S S )

Quarkus + GraalVM Quarkus + OpenJDK Best of traditio

slide-50
SLIDE 50

M E M O R Y ( R S S ) M E M O R Y ( R S S )

Quarkus + GraalVM Quarkus + OpenJDK Best of traditio

REST REST 13 MB 13 MB 74 MB 74 MB 140 M 140 M

slide-51
SLIDE 51

M E M O R Y ( R S S ) M E M O R Y ( R S S )

Quarkus + GraalVM Quarkus + OpenJDK Best of traditio

REST REST 13 MB 13 MB 74 MB 74 MB 140 M 140 M REST+JPA REST+JPA 35 MB 35 MB 130 MB 130 MB 218 M 218 M

slide-52
SLIDE 52

S T A R T U P T I M E S T A R T U P T I M E

Often frameworks use lazy initialization "started" before all classes are initialized

slide-53
SLIDE 53

S T A R T U P T I M E S T A R T U P T I M E

Often frameworks use lazy initialization "started" before all classes are initialized

T I M E T O F I R S T R E Q U E S T T I M E T O F I R S T R E Q U E S T

slide-54
SLIDE 54

T I M E T O F I R S T R E Q U E S T T I M E T O F I R S T R E Q U E S T

s + GraalVM 0.014 sec Quarkus + OpenJDK 0.75 sec Traditional Cloud-Native Stack 4.3 sec

slide-55
SLIDE 55

T I M E T O F I R S T R E Q U E S T T I M E T O F I R S T R E Q U E S T

s + GraalVM 0.014 sec Quarkus + OpenJDK 0.75 sec Traditional Cloud-Native Stack 4.3 sec

JPA

s + GraalVM 0.055 sec Quarkus + OpenJDK 2.5 sec Traditional Cloud-Native Stac

slide-56
SLIDE 56

D E V E L O P E R ' S J O Y ? D E V E L O P E R ' S J O Y ?

slide-57
SLIDE 57
slide-58
SLIDE 58

Show me! Demo #2

slide-59
SLIDE 59

H O W I T W O R K S H O W I T W O R K S

slide-60
SLIDE 60

*.class QUARKUS

  • ptimized jar

native executable JVM

Maven/Gradle plugin

slide-61
SLIDE 61

T R A D I T I O N A L A P P T R A D I T I O N A L A P P S E R V E R S E R V E R

XML parsers, annotation lookups, management model, ... Thousands of classes run only during the boot

  • Later unused
  • Still occupy memory
slide-62
SLIDE 62

Quarkus:

B U I L D T I M E B O O T B U I L D T I M E B O O T

As much work as possible done at build time Output: recorded wiring bytecode Application model validation

  • Configuration parsing
  • Annotation lookup and evaluation
  • ...
slide-63
SLIDE 63

W i r i n g c o d e i n v o c a t i o n W i r i n g c o d e i n v o c a t i o n

Flexible static initializer OR main()

preferred access to files, sockets, etc.

slide-64
SLIDE 64

C o r e + E x t e n s i o n s C o r e + E x t e n s i o n s

slide-65
SLIDE 65

Q U A R K U S E X T E N S I O N S Q U A R K U S E X T E N S I O N S

Required for frameworks that hit GraalVM limitations

  • Opportunity to highly optimise also for JVM
  • Code strictly separates build time analysis and

runtime: extemely lean output!

slide-66
SLIDE 66

W H A T C A N A N W H A T C A N A N E X T E N S I O N D O ? E X T E N S I O N D O ?

Invoke Quarkus helpers to dynamically Interact with the GraalVM compiler needs

  • Generate "Bootstrap at build" initializers
  • Much much more... and evolving
slide-67
SLIDE 67

Q U A R K U S W R A P U P Q U A R K U S W R A P U P

Makes Java the #1 choice for the cloud and serverless Good old Java

More fun, less weight

Can go small as Go, works great on JVM too

slide-68
SLIDE 68

V E R S I O N 0 . X . Y ? V E R S I O N 0 . X . Y ?

Early days!

slide-69
SLIDE 69

V E R S I O N 0 . X . Y ? V E R S I O N 0 . X . Y ?

Early days! Yet based on proven libraries

slide-70
SLIDE 70

T H A N K Y O U ! T H A N K Y O U !

Q & A Q & A

Docs & guides:

quarkus.io Chat:

quarkusio.zulipchat.com Quickstarts:

github.com/quarkusio/quarkus-quick Stack Overflow tag:

quarkus Twitter:

@quarkusio

slide-71
SLIDE 71

Q U A R K U S C H E A T S H E E T S Q U A R K U S C H E A T S H E E T S

https://quarkus.io/get-started/

$ mvn io.quarkus:quarkus-maven-plugin:0.13.3:create \

  • DprojectGroupId=org.acme \
  • DprojectArtifactId=quarkus-hello \
  • DclassName="org.acme.quickstart.GreetingResource" \
  • Dpath="/hello"

$ mvn package $ java -jar target/*-runner.jar INFO [io.quarkus] (main) Quarkus 0.11.0 started in 0.729s. INFO [io.quarkus] (main) Installed features: [cdi, resteasy]

slide-72
SLIDE 72

N A T I V E N A T I V E

https://quarkus.io/guides/building-native-image-guide

$ mvn package -Pnative $ ls -lh target/*-runner

  • rwxrwxr-x. 1 sanne sanne 17M Mar 20 14:39 target/quarkus-hello

$ ./target/*-runner INFO [io.quarkus] (main) Quarkus 0.13.3 started in 0.003s. INFO [io.quarkus] (main) Installed features: [cdi, resteasy]

slide-73
SLIDE 73

D E V M O D E D E V M O D E

https://quarkus.io/guides/getting-started-guide

$ mvn compile quarkus:dev

slide-74
SLIDE 74

T E S T I N G T E S T I N G

@QuarkusTest runner JUnit 4 or 5

https://quarkus.io/guides/getting-started-guide#testing

$ mvn clean test

slide-75
SLIDE 75

T E S T I N G N A T I V E T E S T I N G N A T I V E

@SubstrateTest runner

https://quarkus.io/guides/building-native-image-guide.html#testing-the-native- executable

$ mvn clean verify -Pnative

slide-76
SLIDE 76

A D D A N E X T E N S I O N A D D A N E X T E N S I O N

https://quarkus.io/guides/maven-tooling.html

$ mvn quarkus:add-extension -Dextensions=hibernate-orm-panache

slide-77
SLIDE 77

P A N A C H E P A N A C H E

Makes simple Hibernate ORM easy

https://quarkus.io/guides/hibernate-orm-panache-guide

@Entity public class Person extends PanacheEntity { public String name; public LocalDate birth; public PersonStatus status; }

slide-78
SLIDE 78

P A N A C H E P E R S I S T P A N A C H E P E R S I S T

https://quarkus.io/guides/hibernate-orm-panache-guide

// Create a person Person person = new Person(); person.name = "Stef"; // Persist and delete person.persist(); person.delete();

slide-79
SLIDE 79

O T H E R E X T E N S I O N S O T H E R E X T E N S I O N S

Discover them

https://quarkus.io/guides/maven-tooling.html

$ mvn quarkus:list-extensions ... Available extensions: ... * Hibernate ORM (io.quarkus:quarkus-hibernate-orm) * Hibernate ORM with Panache (io.quarkus:quarkus-hibernate-orm-panache) * Hibernate Validator (io.quarkus:quarkus-hibernate-validator) ...

slide-80
SLIDE 80

O T H E R E X T E N S I O N S O T H E R E X T E N S I O N S

Contribute them!

https://github.com/quarkusio

ASL2

Open community