加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

分析内存管理机制的变更,你需要了解

发布时间:2021-05-23 20:52:49 所属栏目:编程 来源:互联网
导读:这时辰也许至少分两拨小搭档,别离是: 知道是什么,被这个题目 熬煎 过的,刹时面前一亮。 不知道是什么,呈现了各类迷惑了,这说的都是些什么。 魂灵拷问 你有

这时辰也许至少分两拨小搭档,别离是:

知道是什么,被这个题目 “熬煎“ 过的,刹时面前一亮。

不知道是什么,呈现了各类迷惑了,这说的都是些什么。

魂灵拷问

你有没有以下的疑问,可能是否清晰:

文中所说的 MADV_FREE 是什么?

文中所说的 MADV_DONTNEED 是什么?

为什么特指 Go 说话的 Linux 情形?

为什么是说从 MADV_FREE改回 MADV_DONTNEED?

在本日这篇文章中我们都将进一步的睁开和声名,让我们一同来相识这个改来改去的内存机制到底是何物。

madvise 爱与恨

在 Linux 体系中,在 Go Runtime 中通过体系挪用 madvise(addr, length, advise) 要领,可以或许汇报内核如那里理赏罚从 addr 开始的 length 字节。

重点之一就是 ”如那里理赏罚“,在 Linux 下 Go 说话中今朝支持两种计策,别离是(via @felix021):

MADV_FREE:内核会在历程的页表中将这些页标志为 “未分派”,从而历程的 RSS 就会变小。OS 后续可以将对应的物理页分派给其他历程。

MADV_DONTNEED:内核只会在页表中将这些历程页面标志为可接纳,在必要的时辰才接纳这些页面。

所带来的影响

Go 说话官方刚好就在 2019 年的 Go1.12 做了如下调解。

Go1.12 早年。

Go.12-Go1.15.

Go1.12 早年

Go Runtime 在 Linux 上默认行使的是 MADV_DONTNEED 计策。

// 没有任何奇稀疏怪的判定 

madvise(v, n, _MADV_DONTNEED) 

从整体结果来看,历程 RSS 可以降落的较量快,但从机能服从上来看差点。

Go1.12-Go1.15

当前 Linux 内核版本 >=4.5 时,Go Runtime 在 Linux 上默认行使了机能更为高效的 MADV_FREE 计策。

var advise uint32 

if debug.madvdontneed != 0 { 

 advise = _MADV_DONTNEED 

} else { 

 advise = atomic.Load(&adviseUnused) 

if errno := madvise(v, n, int32(advise)); advise == _MADV_FREE && errno != 0 { 

 // MADV_FREE was added in Linux 4.5. Fall back to MADV_DONTNEED if it is 

 // not supported. 

 atomic.Store(&adviseUnused, _MADV_DONTNEED) 

 madvise(v, n, _MADV_DONTNEED) 

从整体结果来看,历程RSS 不会立即降落,要比及体系有内存压力了才会开释占用,RSS 才会降落。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读