| I couldn't have said it better. This is almost word for word why I decided to build mmm: I maintain a few high-load RPC services in Go, each of which stores millions, if not tens of millions of items in their cache. In this configuration, each incoming request means allocations inside Go's RPC package [1], which in turn means that a GC pass will be triggered if GC_PERCENT [2] has been reached, which in turn means that the GC will have to scan all of those long lived pointers (Go's GC is not generational), which in turn means a huge peak in response time. This basically leaves me with three possible solutions: - hack into Go's RPC package to minimize allocations, which is a huge price to pay just to delay the inevitable - build my caches in a language that offers manual memory management, then query those via RPC from my Go services; but I don't want to add a new language into the mix - provide a generic solution for manual memory management in Go, which is where we are now [1] https://golang.org/pkg/net/rpc/ [2] https://golang.org/pkg/runtime/debug/#SetGCPercent |