在看 redis 1.0 源码时,总会看到需要申请内存的地方,如果申请不到需要大的内存就会返回 NULL,然后在调用层抛出 oom。

比如 listDup 中在复制特殊 value 或者加入新节点时都有可能返回 NULL

if (copy->dup) {
value = copy->dup(node->value);
if (value == NUL) {
...
return NULL;
}
}
...
if (listAddNodeTail(copy, value) == NULL) {
...
return NULL;
}

调用层中发现复制失败,抛出 oom

c->reply = listDup(slave->reply);
if (!c->reply) oom("listDup copying slave reply list");

oom 中执行 abort()

static void oom(const char *msg) {
fprintf(stderr, "%s: Out of memory\n",msg);
fflush(stderr);
sleep(1);
abort();
}

然后我就想到了 golang 的 make/new,平时都不会遇到 oom 的情况,感觉每次 make/new 都会成功,并且这两个函数都没有特殊返回值来标识失败的情况,因此在底层应该是做了处理。

由于之前在 mapassign 中看到分配桶的情节,最终在 mallocgc 函数中找到了目标函数 allocLarge

// allocLarge allocates a span for a large object.
func (c *mcache) allocLarge(size uintptr, noscan bool) *mspan {
if size+_PageSize < size {
throw("out of memory")
}
npages := size >> _pageShift
if size&_PageMask != 0 {
npages++
}
// Deduct credit for this span allocation and sweep if
// necessary. mHeap_Alloc will also sweep npages, so this only
// pays the debt down to npage pages.
deductSweepCredit(npages*_PageSize, npages)
spc := makeSpanClass(0, noscan)
s := mheap_.alloc(npages, spc)
if s == nil {
throw("out of memory")
}
...
}

throw 最终调用 fatalthrow

// fatalthrow implements an unrecoverable runtime throw. It freezes the

// system, prints stack traces starting from its caller, and terminates the

// process.

最终也是终止程序,看上去和 abort 一样

嗯,既然 golang 已经做了这部工作,那我就需要担心内存不够如何处理的问题了(虽然很大概率遇不到)

【小记】如果 golang 内存不够了怎么办的更多相关文章

  1. golang内存分配

    golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) unsafe.Pointer { flags ...

  2. golang 内存监控

    golang 内存监控 - 简书 https://www.jianshu.com/p/38dc129b6870

  3. Golang内存管理

    Golang 内存管理 原文链接[http://legendtkl.com/2017/04/02/golang-alloc/] Golang 的内存管理基于 tcmalloc,可以说起点挺高的.但是 ...

  4. Golang内存模型

    Ref: https://golang.org/ref/mem 简介 golang内存模型,主要说明了如下问题.在一个goroutine中读取变量,而该变量是由其他goroutine赋值的,这种情况下 ...

  5. 记一次golang内存泄露

    记一次golang内存泄露 最近在QA环境上验证功能时,发现机器特别卡,查看系统内存,发现可用(available)内存仅剩200多M,通过对进程耗用内存进行排序,发现有一个名为application ...

  6. [golang]内存不断增长bytes.makeSlice

    ------------------------------------------ 2015.7月更新 后面发现这里其实有一个sb的问题,在于内存回收和释放. 每个http请求,都会带一个http. ...

  7. 图解golang内存分配机制 (转)

    一般程序的内存分配 在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况: 以上是程序内存的逻辑分类情况. 我们再来看看一般程序的内存的真实(真实逻辑)图: Go的内存分配核心思想 G ...

  8. golang 内存模型

    1,是什么 是一套规范.内存操作指导 解决多线程编程的 程序的 原子性,有序性,可见性(主要)的问题. 多核操作系统,会存在缓存不一致的情况,说到底是一个同步的问题. 2, 内容 内存模型,除了定义了 ...

  9. Golang内存分配内置函数之new函数

    new函数用来分配内存,主要分配值类型,比如int.float32.struct等,返回的是指针 package main import ( "fmt" ) func main() ...

  10. golang 内存分析/动态追踪

    如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态.这个时候就可以选择net/http/pprof.你只需要引入包_"net/http/pprof" ...

随机推荐

  1. 云服务器 CentOS 的使用历程

    ------------恢复内容开始------------ CentOS图形页面的下载 安装X(X Window System),命令如下: yum groupinstall "X Win ...

  2. react零基础使用react-redux管理状态全过程(单组件)

    首先下载react-redux插件  yarn add react-redux 或 npm add react-redux 然后创建一个容器组件Container connect(mapStateTo ...

  3. [WPF]MVVM的数据绑定

    啥是MVVM? 我理解的MVVM是Model(数据),View(界面),ViewModel(数据与界面之间的桥梁)的缩写,是一种编程模式.前期需要多花一些时间去编辑绑定,在后期维护方便.只需要关注数据 ...

  4. Ubuntu上安装TensorFlow

    一.更新环境 sudo apt-get update sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg- ...

  5. Codeforces Round #748 (Div. 3) - D2. Half of Same

    数论 + 随机化 [Problem - D2 - Codeforces](https://codeforces.com/contest/1749/problem/D) 题意 给定一个长度为 \(n\; ...

  6. 面向对象程序设计第三次blog

    一.前言 第六次题目集总结-- 题量:较少 难度:较高 知识点: 判断输入内容 提取输入的有效信息并进行计算 总结:题目比较难,题量较少. 第七次题目集总结-- 题量:较少 难度:一般 知识点: 输入 ...

  7. CentOS7 搭建 PXE 安装系统

    1. PXE介绍 2. 服务的搭建 2.1 DHCP服务搭建 2.1.1 安装DHCP软件包 2.1.2 修改dhcp配置文件 2.1.3 开启DHCP服务 2.1.4 查看dhcp服务是否开启 2. ...

  8. git 删除本地分支以及远程分支

    1.git branch -a 2. git branch -d v1.3(要删除的本地分支) 3.git push origin --delete v1.3(远程分支)

  9. hyper给linux扩容空间

    1.hyper操作 (1)关机后,在设置中,查看硬盘驱动器中的虚拟磁盘及编号, (2)编辑磁盘->查找磁盘中选中刚才的编号磁盘 (3)操作时扩容(大小填的不是增量 ,是扩容以后的空间) 2.li ...

  10. requests学习笔记02

    一.会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能. ...