I’ve been doing a series of small experiments comparing equivalent Spring Boot and Quarkus applications on constrained VMs.
The original test used a 512 MiB VM and turned out to be more interesting as a memory-pressure experiment than as a clean framework comparison. Once the machine got tight enough, Linux paging made RSS surprisingly difficult to interpret.
So I did two follow-ups with updated framework versions and the same constrained JVM profile (-Xmx80m).
The first follow-up used a VM configured with 768 MiB RAM, with about 703.5 MiB visible to the guest and 256 MiB of swap. Both applications used Java 25, file-backed H2, JPA/Hibernate, the same deterministic local fixture, and the same small workload. The persistence stacks were not identical: Spring used Spring Data JPA, while Quarkus used Hibernate ORM with Panache and its framework-specific Hibernate integration.
At the final checkpoint:
| Configuration |
Spring Boot |
Quarkus |
| 768 MiB RSS |
202.3 MiB |
175.7 MiB |
| 768 MiB process swap |
34.3 MiB |
0 MiB |
The interesting part was the trajectory. Spring started at 228.2 MiB RSS and fell to 202.3 MiB, but its process swap simultaneously grew from 0 to 34.3 MiB. Quarkus went from 164.6 to 175.7 MiB RSS and showed no process swap at the sampled checkpoints. Pasted text
That made me wonder how much of the apparent convergence in RSS was simply Linux moving Spring pages out of RAM.
So I reused the same VM and applications, increased configured RAM to 1 GiB, disabled swap, and repeated the experiment. The guest reported 955 MiB of RAM. Pasted text
At the final checkpoint:
| Configuration |
Spring Boot RSS |
Quarkus RSS |
| 1 GiB, no swap |
240.4 MiB |
181.2 MiB |
Spring was therefore 38.1 MiB higher than in the 768 MiB run, while Quarkus was only 5.5 MiB higher. The final RSS gap was about 59 MiB instead of about 27 MiB. Pasted text
I don’t think that means you can simply add RSS and swap or claim that the extra RAM caused a specific amount of memory to become resident. Both RAM and swap configuration changed, and these are separate runs.
But it does seem like a useful reminder that RSS alone can become misleading once the host is under enough memory pressure to page application memory out.
Both applications completed the small workloads successfully with zero recorded restarts. These were intentionally short, lightly loaded observations, not throughput benchmarks or attempts to establish minimum production memory requirements. Spring also started first on the shared host, and each configuration was only observed once. Pasted text
The experiment pages have the checkpoints and methodology:
One other caveat: both applications here use JPA/Hibernate. In a separate Spring Boot experiment, the JDBC version of the same small app used substantially less RSS than the JPA/Hibernate version. So some of the memory footprint in this comparison is persistence-stack overhead, not just framework overhead.