您可以调整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需求绝对是非常棒的,因此感谢大家的时间和有用的建议。
干杯。