189 8069 5689

Go中内存释放的改进是怎样的

这篇文章主要为大家分析了Go中内存释放的改进是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Go中内存释放的改进是怎样的”的知识吧。

建宁ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

一直以来 go 的 runtime 在释放内存返回到内核时,在 Linux 上使用的是 MADV_DONTNEED,虽然效率比较低,但是会让 RSS(resident set size 常驻内存集)数量下降得很快。不过在 go 1.12 里专门针对这个做了优化,runtime 在释放内存时,使用了更加高效的 MADV_FREE 而不是之前的 MADV_DONTNEED

这样带来的好处是,一次 GC 后的内存分配延迟得以改善,runtime 也会更加积极地将释放的内存归还给操作系统,以应对大块内存分配无法重用已存在的堆空间的问题。不过也会带来一个副作用:RSS 不会立刻下降,而是要等到系统有内存压力了,才会延迟下降。需要注意的是, MADV_FREE 需要 4.5 以及以上内核,否则 runtime 会继续使用原先的 MADV_DONTNEED 方式。

比如,我最近就遇到了这个问题:

Go中内存释放的改进是怎样的

几台服务的请求量差别并不大,可以明显看到 25(4.14 内核,其他几台都是 3.10 内核)的内存释放看起来很慢,但是 HEAP 占用显示却正常:

顺便说下,4.1 以上内核,最为引人注目的特性就是 eBPF,通过一个内核内置的字节码虚拟机,可以完成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能,是 Linux 系统的性能分析利器。

Go中内存释放的改进是怎样的

当然 go 1.12 为了避免像这样一些靠判断 RSS 大小的自动化测试因此出问题,也提供了一个 GODEBUG=madvdontneed=1 参数可以强制 runtime 继续使用 MADV_DONTNEED:runtime: provide way to disable MADV_FREE。但是显然正常情况下,我们都应该优先使用 MADV_FREE

go适合做什么

go是golang的简称,而golang可以做服务器端开发,且golang很适合做日志处理、数据打包、虚拟机处理、数据库代理等工作。在网络编程方面,它还广泛应用于web应用、API应用等领域。

关于“Go中内存释放的改进是怎样的”就介绍到这了,更多相关内容可以搜索创新互联以前的文章,希望能够帮助大家答疑解惑,请多多支持创新互联网站!


当前文章:Go中内存释放的改进是怎样的
当前链接:http://jkwzsj.com/article/gdidig.html

其他资讯