Index · How it works

1 min read
Foundational1 min read
Rapid overview

How it works

Idle footprint comparison

RuntimeIdle RSSCold startContainer baseGC model
.NET 9 (Server GC)120–200 MB1–3 s~200 MBConcurrent generational, heap segment per logical core
.NET 9 + Native AOT30–60 MB<100 ms~80 MBWorkstation GC, no JIT
Go (Gin/Echo/Chi)10–25 MB<50 ms5–20 MB (scratch/distroless)Concurrent mark-sweep, sub-ms pauses

Why the numbers look like this

  • .NET default: CLR + JIT compiler + ASP.NET pipeline + Server GC heap reserves. Server GC allocates a heap segment per logical core and is reluctant to return memory to the OS — optimized for throughput on a dedicated machine, hostile to "many idle services on one box."
  • .NET AOT: ahead-of-time compiled, no JIT, smaller runtime surface, Workstation GC by default. Same language, smaller floor.
  • Go: ~2 MB runtime, goroutine stacks 2 KB each (grow on demand), concurrent mark-sweep tuned for low pause over peak throughput.

Cold start matters when…

  • Scale-to-zero is on the table (Knative, AWS Lambda, ACA minReplicas=0)
  • Frequent deploys → frequent restarts → frequent first requests
  • First-request latency is user-visible