项目遇到一个问题,程序跑着跑着就会挂掉,从多方信息分析来看,发现在设备的linux系统中,一个进程申请的内存最大只能达到1GB,而设备所用的物理内存是2GB的。我们的程序有多个进程,但主进程只有一个,里面包括几十个线程,有的线程使用了如opencv的模块,占用内存有几百兆。而之前在文章提到的H.264转AVI,也必须将转码后的AVI格式内容放在内存,由于某些原因,系统中的内存使用峰值会达到1GB。但由于我正在搞其它的bug,这个实际是同事研究出来的,我也只是再次多方面地验证了一下。还是在这里记录一下吧。

测试所用的代码很简单,就是不断地申请内存。

#define BUF_LEN (8*1024*1024)
int main(void)
{
int cnt = 0;
char* p = NULL;
unsigned int total = 0;
while (1)
{
cnt++;
p = (char*)malloc(BUF_LEN);
if (p==NULL)
{
printf("[%d]malloc for %d failed.\n", cnt, BUF_LEN);
break;
}
total += BUF_LEN;
printf("[%d]malloc %p ok total: %u(%.1fKB %.1fMB)\n", cnt, p, total, total/1024.0, total/1024.0/1024.0);
}
return 0;
}

在系统未做配置前,执行上述程序,只能申请900MB的内存。运行结果如下:

[112]malloc 0x7f575008 ok total: 939524096(917504.0KB 896.0MB)
[113]malloc 0x7ed74008 ok total: 947912704(925696.0KB 904.0MB)
[114]malloc 0x7e573008 ok total: 956301312(933888.0KB 912.0MB)
[115]malloc for buff failed.

查找一些资料发现,内存的使用与/proc/sys/vm/overcommit_memory和/proc/sys/vm/overcommit_ratio似乎有关。经过我的测试,似乎和overcommit_memory关系更密切。对于overcommit_memory,我们的设备代码一直都是使用系统的默认值2。在2GB内存系统上只能申请900MB。但是,将它设置为1时,就可以申请最大的内存,执行如下命令临时生效:
echo 1 > /proc/sys/vm/overcommit_memory

再次运行上述程序,结果如下:

[380]malloc 0xbdfd7008 ok total: 3187671040(3112960.0KB 3040.0MB)
[381]malloc 0xbe7d8008 ok total: 3196059648(3121152.0KB 3048.0MB)
[382]malloc 0xbefd9008 ok total: 3204448256(3129344.0KB 3056.0MB)

注:测试中,申请内存的限制与overcommit_ratio的值无关,但修改overcommit_ratio会引起/proc/meminfo的中的值的变化。当overcommit_ratio为10时,信息如下:
cat /proc/meminfo | grep Commit       
CommitLimit:      679932 kB
Committed_AS:     495736 kB

当overcommit_ratio为50时,信息如下:
# cat /proc/meminfo | grep Commit       
CommitLimit:     1465500 kB
Committed_AS:     495736 kB

2015.8.4 晚 李迟

让Linux使用malloc申请更多的内存相关推荐

  1. malloc申请得到的内存后,再free释放它的时候,操作系统会立即收回那块内存吗?

    stackoverflow上的回答: In many malloc/free implementations, free does normally not return the memory to  ...

  2. linux下malloc申请大内存,Linux malloc大内存的方法

    ---------------------------------------------------------------------------------------------------- ...

  3. malloc一次性最大能申请多大内存空间

    受用户态内存地址空间的限制.64 位系统下分配几个 T 不成问题. 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:zz matrix 链接:http://www.zhi ...

  4. linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?

    当一个进程退出后,不管是正常退出或者是异常退出,操作系统都会释放这个进程的资源.包括这个进程分配的内存,打开的文件等等. 内存泄露的前提是进程一直在运行:进程一旦退出,所占的整个虚拟内存都被销毁,所有 ...

  5. linux下的malloc申请的是虚拟还是物理的,关于malloc申请内存

    自学笔记(一) 个人理解 linux内存采用分页的内存管理,而32位pc机还采用了段式内存管理,它的地址关系为:逻辑地址--->虚拟地址(也叫线性地址)--->物理地址. linux所有段 ...

  6. linux malloc free 内存碎片_内存申请malloc/new与内存释放free/delete的区别

    前面的文章小编说过,存放在堆上的数据是由程序员小哥哥负责申请和回收的.今天我们就说一下动态申请内存的指令以及他们之间的区别.最普遍的申请内存方式就是malloc/free与new/delete; 为了 ...

  7. Linux系统下深究一个malloc/brk/sbrk新内存后的page fault问题

    有耳可听的,就应当听 -<马可福音> 周四的休假团建又没有去,不因别的,只因年前东北行休假太多了,想缓缓-不过真实原因也确实因为假期剩余无几了-思考了一些问题,写下本文.   本文的缘起来 ...

  8. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  9. 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多

    前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...

最新文章

  1. angular 之 jqLite
  2. Confluence 6 中样式化字体
  3. Linux内核中无名管道pipe和有名管道fifo的分析
  4. 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试
  5. android id 重名_android - 解决“应用自定义权限重名”
  6. Python科学计算和数据分析库简介
  7. Mentor软件盗版
  8. 扎心!五成程序员年薪 10-20 万,超半数资深程序员薪资高于 20 万
  9. 3DES加密(iOS,Android,Java)
  10. Python模块查询
  11. ipad微信号无法连接服务器,ipad微信内置浏览器无法微信登录
  12. Java毕业设计_基于javaee创新创业实验室管理系统
  13. 计算机表格常用根式,excel怎么建立常用根式_在excel中怎样开根号�9�3
  14. 基于翻译的模型-TransE,TransH,TransR,TransD
  15. 简单几步告别OpenCV Manager
  16. 怎样高效阅读英文的C语言,必读!科研大牛分享,如何高效阅读英文文献?
  17. Windows--U盘启动盘制作
  18. 关于Charles手机设置好代理后,无法上网的问题
  19. iOS根据银行卡号识别银行
  20. 结合569个抖音+电商的成功案例,总结出新一套的短视频运营方案

热门文章

  1. “蔚小理”将齐聚港股!蔚来申请在港IPO,计划3月10日上市 9个月亏损近19亿元...
  2. 三星Galaxy S22系列零部件开始量产:搭载骁龙898 最早1月亮相
  3. 还要做手机?罗永浩称还完债就重返科技行业
  4. Facebook将用实际行动引导青少年远离有害内容
  5. 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
  6. 字节跳动研发的云固件投入应用 首批装机200余台X86服务器
  7. 消息称苹果关联公司1.25亿美元购买车辆测试场 占地超过3万亩
  8. 疫情之下困难的设备维护工作该如何解决? ​
  9. 荣耀:目前还在观望鸿蒙,未来的对手是苹果
  10. 富士康将把部分iPad和MacBook生产线从中国转移到越南