Description
What version of Go are you using (go version
)?
$ go version go version go1.12.13 darwin/amd64 go version go1.13.4 darwin/amd64
Does this issue reproduce with the latest release?
Yes. Tested on
go version go1.4-bootstrap-20170531 darwin/amd64
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GO111MODULE="on" GOARCH="amd64" GOBIN="" GOCACHE="/Users/qwe/Library/Caches/go-build" GOENV="/Users/qwe/Library/Application Support/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GONOPROXY="none" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/qwe/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/Cellar/go/1.13.4/libexec" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/Cellar/go/1.13.4/libexec/pkg/tool/darwin_amd64" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/qv/37vc1dv526n0drc9jljj4v240000gp/T/go-build366955304=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
Original issue description is posted at gonum library repo gonum/gonum#1174
In a few words: we have a huge graph in memory and we need to update it periodically.
After a new graph initialization, we switch pointer to the new graph and wait for GC to free unused memory.
But it never reuses all the HeapIdle and asks OS for new pages increasing HeapSys infinitely.
Base self-contained demo: https://github.com/savalin/example/blob/master/main.go.
It's simplified code but even this one shows some memory management strangeness.
What did you expect to see?
HeapIdle re-usage instead of asking OS for new memory.
What did you see instead?
HeapIdle/HeapSys grow infinitely (until OMM-killer wake up and kill the app)
Currently, we downgraded golang to v1.11.13 as a workaround, but we hope to be able to use new golang releases