Ran Spring Boot and Node.js side-by-side in prod for 18 months. Sharing the actual numbers.
We had a stack debate on my team back in 2024 that ended with "fine, let's just run both and see." Same microservice, built twice — once in Spring Boot 3.2 / Java 21, once in Node 20 / Express. Same Postgres, same Redis, same AWS ECS setup. 18 months later I went through Cost Explorer and our time tracking.
Sharing the numbers in case anyone else is having this debate:
Infrastructure (18 months):
- Node.js: ~$10,890 (needed 1GB RAM/instance after month 3)
- Spring Boot: ~$5,490 (stayed at 512MB the whole time)
Developer time on production issues:
- Node.js: ~285 hours (memory leaks, npm breaking changes, async race conditions, audit fixes)
- Spring Boot: ~26 hours (dependency updates, one N+1, pool tuning)
Memory pattern that surprised me most: Node.js instances climbed 180MB → 890MB over 4 days, crashed, restarted. Staircase to hell. Traced to event listener leak in a popular npm package (2M weekly downloads). Spring Boot stayed flat at ~280MB the entire 18 months.
Under Black Friday load (10x normal traffic):
- Node.js: 3 instances OOM-crashed during peak. Cold start under load: 2.4s.
- Spring Boot: Zero crashes. Cold start under load: 4.1s (slower, but stable).
Not saying Node is bad. We kept it for internal admin tools and low-traffic stuff. But for customer-facing APIs that need to stay up 24/7, the JVM's 25 years of GC engineering paid for itself many times over.
Curious if anyone else has run this kind of side-by-side. Specifically interested in:
- Did virtual threads (Java 21) change your scaling math?
- Anyone tried Bun or Deno in this same comparison? Would they hold up better than Node?
- How much of the Node memory issue is npm ecosystem vs V8 itself?