Java 8 vs Java 11 – Productive business application benchmark

Last week I could finally migrate a productive business application from Java 8 to Java 11. Until now the Continues Integration Pipeline didn’t support Java 11 completely. As that changed last week I could finally deploy the application on the clients OpenShift cluster.

The application is a simple CRUD-Rest Service on top of an Oracle Cloud DB. The application runs on Spring Boot using the Undertow engine. Otherwise, it depends on Spring Data, Spring Security (Keycloak), Spring Boot Admin and Swagger. The application is deployed and running in OpenShift. During the performance test, we are using 2 PODs.

Currently, the application uses the following JVM Parameters:

-Xms512m
-Xmx2048m
-XX:MaxMetaspaceSize=256m
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XX:+ScavengeBeforeFullGC
-XX:ParallelGCThreads=2
-XX:ConcGCThreads=1
-XX:+ExitOnOutOfMemoryError
-Djava.net.preferIPv4Stack=true

I didn’t change any JVM Parameter when switching between Java 8 and 11. The benchmark uses the Gatling framework.

As the applications bottleneck seems to be the database we can expect further improvements in applications with a higher percentage of Java business code.

In the future, I will try to optimize the Java 11 JVM parameters further. Stay tuned for updates.


UPDATE

I had a look at the RAM usage again. Java 11 seems to commit more RAM per default. But didn’t use more.

  • Java 11 used 292 MB, but committed 899
  • Java 8 used 311 MB, but committed 710