linux malloc命令,让Linux使用malloc申请更多的内存

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22#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的内存。运行结果如下:

1

2

3

4[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时,就可以申请最大的内存,执行如下命令临时生效:

1echo 1 > /proc/sys/vm/overcommit_memory

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

1

2

3[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时,信息如下:

1

2

3# cat /proc/meminfo | grep Commit

CommitLimit: 679932 kB

Committed_AS: 495736 kB

当overcommit_ratio为50时,信息如下:

1

2

3# cat /proc/meminfo | grep Commit

CommitLimit: 1465500 kB

Committed_AS: 495736 kB

2015.8.4 晚 李迟

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值