Shaun leads product management of GraalVM at Oracle Labs where he focuses on Java Cloud Native technologies and frameworks. He’s participated in a number of open source projects including the Fn Project, various Eclipse Foundation projects, and GraalVM. He is an experienced speaker who has presented at JavaOne/CodeOne, Devoxx, QCon, JAX, EclipseCon, and many other developer conferences and user groups around the world.
Containers are increasing the way Java applications are packaged and deployed. There are lots of qualities desirable in a containerized application like fast startup and low memory and CPU requirements, but size and security are also important considerations. Moving big container images around a network will increase the time it takes to start up a new K8s pod or launch a container, and "just enough operating system" container images with reduced attack surface area are also preferable. So what’s the smallest possible Java container image? In this session we’ll demonstrate how to build containerized Java applications small as a mere 1.5MB! Using GraalVM Native Image ahead-of-time compilation and static linking with musl libc we can shrink down and strip out all the unnecessary bits that bloat a typical Java apps and deploy them in lightweight and security focused container images like Alpine and distroless–even scratch!
What do Quarkus, Spring Native, Micronaut, and Helidon have in common? They all support GraalVM Native Image ahead-of-time (AOT) compilation to transform applications into a native machine executables that starts almost instantaneously, provides peak performance with no warmup, and require less memory and less CPU. It's perfect for containerized workloads and microservices where maximizing startup time and minimizing required resources is critical. In this workshop we'll provide a practical introduction to GraalVM Native Image AOT covering how it works, what it can do, when to use it, and how to tune and debug applications.
Topics include: building with Maven and Gradle, static and dynamic linking, containerization, configuration, working with resources, profile guided optimization, garbage collection options, and JUnit testing and debugging native executables