今天修改了一下influx-relay,增加一个pprof的debug http 接口,跑起来后,对比了下系统统计的物理内存占用和通过 /debug/pprof/heap 接口获取的内存分配情况,发现两者差异很大。
如下是top工具展示的内存占用情况,为1.3g。
![image.png](https://static.studygolang.com/191010/64240eebc830060bda26519c8c1a30cd.png)
如下是 /proc/pid/status 中统计的VMRSS,也是1.3g。
![image.png](https://static.studygolang.com/191010/cfb1f327ab266a79a3b63cb96c7b7b28.png)
如下是通过 go tool pprof 获取的内存分配情况,总共就只有15M:
![image.png](https://static.studygolang.com/191010/9ad1159e4f788415e403ae5e4c54b749.png)
这是为什么呢,有没有大佬能指点一下。。
刚看了一篇文章[Go内存泄漏?不是那么简单!](https://colobu.com/2019/08/28/go-memory-leak-i-dont-think-so/)里面提到:
```
可以看到,当对象释放的时候,释放出来的内存并没有立即返还给操作系统,而在我们进行了一次强制垃圾回收后才返还。 Go语言把返还的过程叫做scavenging (拾荒)。这个拾荒的算法一直在演化,可以查看issue #16930,相关的优化提案可以参考:issue #30333。
原先的scavenging是每隔几分钟(5分钟)执行一次拾荒操作,保证程序使用的内存和RSS基本一致。后来在1.11、1.12的演化过程中,改成了"智能"的拾荒操作。目标是尽量避免全部返还给操作系统导致的很重的重获取的花销,但是这也带来了一个问题,那就是当前的拾荒设计对于偶尔一个尖峰,并不会将不用的大量内存返还给操作系统,也就是本文一开始我在项目中遇到的问题。
```
但是还不是很确定本程序是不是这个原因导致的,现在在想办法增加统计下heap的各个状态数据,之后才能确认。
#1