Optimization of Java Applications – CPU Usage, Memory Usage, Startup Time, Resource Efficiency
What possibilities exist to optimize JVM-based applications in terms of CPU usage, memory usage, startup time, resource efficiency, etc.?
Framework
Studies:
- Analyzing JVM Energy Consumption for JDK 17: An Empirical Study – Ionut Balosin
- Wyciślik et al. (2023). A Comparative Assessment of JVM Frameworks to Develop Microservices. https://doi.org/10.3390/app13031343
@Wycislik.etal.2023.ComparativeAssessmentJVM - Belgaid (2022). Green coding: an empirical approach to harness the energy consumption of software services. PHD Thesis. https://theses.hal.science/tel-04074973/
- Jeleń & Dzieńkowski (2021). The comparative analysis of Java frameworks: Spring Boot, Micronaut and Quarkus. https://doi.org/10.35784/jcsi.2724
Quarkus vs. Spring Boot
Quarkus has a much faster startup time and a lower memory usage.
JVM Distribution
How to optimize the runtime efficiency by choosing an optimal JVM distribution?
OpenJ9 vs. HotSpot
OpenJ9 requires less memory than OpenJDK with HotSpot.
Vergilio et al. (2023)
@Vergilio.etal.2023.ComparativePerformanceEnergy
Note: A benchmark suite case was used that focusses on concurrency workloads. The way of how the energy was measured is also questionable (workload inside WSL2, measurement tool on the Windows host system).
Belgaid (2022)
Belgaid developed a tool called JReferral that can help to find the most energy-efficient JVM configuration. For that it runs your Java program through multiple versions of JVMs and optimizations options.
Ournani et al. (2021)
Ournani, Z., Belgaid, M. C., Rouvoy, R., Rust, P., & Penhoat, J. (2021, October 11). Evaluating the Impact of Java Virtual Machines on Energy Consumption. 15th ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM). https://inria.hal.science/hal-03275286
The results of our investigations showed that many JVMs share energy efficiencies and can grouped into 3 classes: HotSpot, J9, and GraalVM. The 3 selected JVM classes can however report a different energy efficiency for different software and/or workloads, sometimes by a large margin. While we did not observed a unique champion when it comes to energy consumption, GraalVM reported the best energy efficiency for a majority of benchmarks. Nonetheless, each JVM can achieve the best or the worst depending on the hosted application.
JVM vs. Native
JVM vs. Native Java Compilation
CRaC, CDS, Project Leyden
Overview created by Sébastien Deleuze (source: LinkedIn)
AOT cache: JEP 483: Ahead-of-Time Class Loading & Linking
JVM Configuration
Memory
java -XX:MaxRAMPercentage=75 -XX:+UseParallelGC -XX:ActiveProcessorCount=<2x yourCpuLimit> myapp.jar
JVM Kubernetes: Optimizing Kubernetes for Java Developers - Pretius
There is no way to guarantee the complete memory bundary of a Java process since the JVM respects only the heap size limit; not non-heap memory, which will depend on various factors. Start with a 75% ratio of heap to non-heap memory, and keep a close watch on how your memory behaves. If things get out of hand, you can tweak your pod’s memory limits or fiddle with the heap-to-non-heapratio to dodge the OOMKilled mishaps.
Memory settings for Java process running in Kubernetes pod | by Fan Liu | Medium
Deployment Type
Minimize the size of your Docker images
The reference application (Spring-PetClinic 2.1.0) used in the experiments needs only 14 modules from a total of 74 modules that comprise OpenJDK 11. By using the Java Linker (jlink), the Java Runtime Environment was customized for the given Java application (Spring-PetClinic), thus enabling us to minimize the size of the resulting Docker image
Database
Database Performance Optimization
🔗 References
Reduce the cloud bill of your Java applications by Ioannis Kolaxis
How to write greener Java applications by Red Hat (→ use Quarkus)
Tradeoffs, Bad Science, and Polar Bears – The World of Java Optimisation By Holly Cummins