Skip to content
Opensource internals
  • Posts

Go

Go's Maps Are Swiss Tables: Groups of 8 Slots, Match Bytes and a Tombstone

Oct 21, 2026 23 min read Jay Hubbert

Go maps are Swiss tables: groups of eight slots with a control word of match bytes, a 7/8 load factor, tombstones instead of empty slots on delete, and incremental growth through a …

GoInternalsMapsHash tablePerformance

Read more →

Go's Memory Allocator: 68 Size Classes, Tiny Allocators and the mcache Fast Path

Oct 21, 2026 22 min read Jay Hubbert

Go rounds small allocations to 68 size classes, keeps one span per class in each P’s mcache, refills from a per-class mcentral, and packs tiny noscan objects into 16-byte blocks.

GoInternalsMemoryAllocatorPerformance

Read more →

Go's netpoller: Why Blocking I/O Doesn't Block a Thread

Oct 21, 2026 16 min read Jay Hubbert

Go’s netpoller parks a blocked goroutine on a pollDesc and wakes it from epoll, so a socket read costs a goroutine, not a thread, and the runtime never blocks in a syscall it did …

GoInternalsNetworkingEpollConcurrency

Read more →

Go's New arena Package: Manual Lifetime for a Faster GC

Oct 21, 2026 18 min read Jay Hubbert

Go’s arena package hands out bump-allocated storage in multi-megabyte chunks that are freed in bulk, quarantined until the GC proves nobody points into them, and set to fault on …

GoInternalsMemoryGarbage collectionPerformance

Read more →

Go's Page Allocator: Virtual Memory, Holes and the Scavenger

Oct 21, 2026 21 min read Jay Hubbert

Go’s page allocator tracks free 8 KiB pages in a bitmap sharded into 4 MiB chunks, summarises them in a five-level radix tree, and returns memory to the OS with madvise while a …

GoInternalsMemoryVirtual memoryPerformance

Read more →

← Newer Page 5 of 12 Older →

© 2026 Jay Hubbert · Built with Hugo 0.168.0

RSS ·