Index · How it works
1 min readRapid overview
How it works
Idle footprint comparison
| Runtime | Idle RSS | Cold start | Container base | GC model |
|---|---|---|---|---|
| .NET 9 (Server GC) | 120–200 MB | 1–3 s | ~200 MB | Concurrent generational, heap segment per logical core |
| .NET 9 + Native AOT | 30–60 MB | <100 ms | ~80 MB | Workstation GC, no JIT |
| Go (Gin/Echo/Chi) | 10–25 MB | <50 ms | 5–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