Microservice architecture and containerization became the standard of modern application development. Challenges that developers face today are different than the problems we used to solve before. The creators of Java runtime react to that by adding suitable functionality to the JDK. For example, a cheap cloud instance can be quite powerful, and a bunch of containers can be run on it. And JVMs running in different containers would fight for the instance's resources. Since Java 10 virtual machines have learned to live in harmony, and Java 11 keeps working on it.
On the other hand, you have to choose a basic image, namely, operating system and Java runtime. Operating system images could differ significantly in size and have their own specific aspects which Java also has to consider. Java runtimes, too, are for any taste and budget. And even within OpenJDK there are builds made by different companies, with different functionality and of different size. Moreover, you can build your own custom runtime image. Different combinations can be used for different development processes and deployment options.