You should look into how go manages goroutines. It is indeed 2kib stacks by default without the need for guard pages. They use a different mechanism to determine overflows. Other runtimes can do similar things.

Aha, yeah. It utilizes the compiler to insert guards at each function prologue, determining the remaining stack size.