A containerized application that consumes less CPU, less memory and less bandwidth (by diminushing the container image size) will generates immediate savings on cloud workloads. Sadly, containerizing Java applications and optimizing them for running inside containers has been quite challenging until recently. So, how to improve the situation?
The main issues with running Java applications in containers are:
Java does not behave as expected (e.g., respect of containers CPU/memory limits).
The base container images for a JRE or a JDK are ginormous: several hundreds of mebibytes! It has an impact on deployment time but it can also lead to security issues. In a 400MiB docker image, the surface attack of your app is definitely larger than in a 50MiB one.
Startup time and ramp-up time (i.e. time before best performances are reached after the code has been fully jit-ed) are significant for short lived apps or apps that are frequently (re-)deployed.
Java reluctantly release memory back to the OS when it does not need it anymore, hence consuming more resources than needed.
During this talk, you will learn how to create damn small container images that consume less resources ($$$) and will start and run your Java applications faster. Too good to be true? Come and see! You will hear about distroless container images, Eclipse OpenJ9 (an open source Java virtual machine) and custom Java runtime images.