内存的分配和回收

内存的分配

malloc()是C标准库提供的内存分配函数, 对应到系统调用上,有两种方式: brk()mmap()
brk() - 小块(小于128K)内存使用brk()来分配, 通过移动堆顶的位置来分配内存. 这些内存在释放后并不会立即回收,而是被缓存起来供重复使用
mmap() - 大块内存使用内存映射mmap()来分配, 在文件映射段找一块空闲内存分配出去

优缺点:

brk(): 缓存能减少缺页异常的发生, 提高内存访问效率. 不过,由于这些内存没有及时被系统回收, 在内存工作繁忙时, 容易产生内存碎片
mmap(): 释放时直接被系统回收, 会造成每次mmap都会发生缺页异常, 在内存工作繁忙时, 会使内核的管理负担增大

另外需要说明一点, 这两种调用发生后,其实并没有真正分配内存.只有在首次访问时通过缺页异常进入内核中分配.

内存的释放
内存如果只分配不释放, 会造成内存泄漏, 甚至会耗尽系统内存. 所以在应用程序用完内存后,还要通过free()或unmap()来释放内存.
当然,系统也不会任由某进程用完所有的内存, 在发现内存紧张时, 就会通过一系列机制来回收内存: 1).回收缓存. 使用LRU(least recently used)算法, 回收最近使用的最少的缓存; 2).回收不常用的内存, 把不常用的内存数据交换到交换分区; 3).杀死进程, 内存紧张时系统会通过OOM(out of memory), 直接杀掉占用大量内存的进程

对第二种情况, 如果频繁使用交换分区, 会导致严重的内存性能问题;
第三种情况, 其实是内存的保护机制, 它监视进程的内存使用情况, 并使用oom_score为每个进程评分:
一个进程消耗的内存越大, oom_score分值越高, 越容易被杀死;一个进程占用的CPU越多, oom_score分值越低, 越不容易被杀掉
为了防止关键进程被oom,可以通过设置进程的oom_adj,进而调整进程的oom_score分值.
oom_adj的范围是[-17,15],最小为-16,最大为15, 数值越大, 越容易被杀死. 其中-17表示禁止oom
如:为防止mysqld被oom,我们可以执行 echo -17 > /proc/$(pgrep mysqld)/oom_adj

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值