您可以调整malloc.h中的mheapmap_位和malloc.goc中的arena_大小以减少

内存使用量,只要它们满足以下条件:

(1UL << (12 + MHeapMap_Bits)) >= arena_size

(例如,我将mheapmap位更改为20,arena大小更改为“4ll<30”,所有测试通过,对于bin/go,bss节的大小将降至约10MB:

linux-amd64 go $ size bin/go # before

   text   data    bss    dec    hex   filename

4491897  9755233672424 38261873 247d471  bin/go

linux-amd64 go $ size bin/go # after

   text   data    bss    dec    hex   filename

4491924  97552 8506600 13096076  c7d48c  bin/go

)

另外,这个问题并不是由保留的vm空间(16gb)引起的

在64位主机上,因为它们是用prot_none映射的,也就是说,它们不会映射到任何物理

记忆)。它的真正原因是大runtime.mheap。

$ vi malloc.h

MHeapMap_Bits=16

$ vi malloc.goc

arena_size=1LL<<28

$ go install -a -v std

Then rebuilt my app which reduce its VPS footprint from 60MB to 20MB!!!

Previously:

MHeapMap_Bits=19

arena_size=1LL<<28

将内存减少到24MB,所以我认为降低内存会降低收益。

我不禁要问,如果内存使用是一个bug,或者这些内存设置是否应该作为go build中的标志可用,或者将来某个时候,运行时可能会得到改进,以便自动做出正确的选择。是否值得提交功能请求/错误报告?

考虑到应用程序rss是2.5MB,我认为总占用空间应该在5-10MB左右?如果是的话,可能还有更多的工作要做,我很乐意测试。

然而,完成大约70%的ram需求绝对是非常棒的,因此感谢大家的时间和有用的建议。

干杯。