@AlexBlack772VmSize is virtual memory footprint and for a Go application it always grows monotonically; the Go runtime never unmaps heap memory. It appears that VmData is just VmSize with a few things subtracted out (https://ewx.livejournal.com/579283.html), so I expect it to have ~the same effect. In generally, address space is cheap on modern systems and does not reflect actual physical memory resources used. When we return memory to the OS, we mark that memory as "unused" to the OS and it's up to the OS to take that memory back. The result is that VmRSS goes down.
VmRSS is the actual physical memory footprint, and Linux won't actually take that memory back until your system is under memory pressure in Go 1.15, because we use MADV_FREE by default (as you point out, though, Linux 3.10.0 doesn't have MADV_FREE, so we fall back on MADV_DONTNEED anyway). In Go 1.16 and above, GODEBUG=madvdontneed=1 is the default.
Tentatively closing this issue as WAI. Please reopen if you feel this is in error.