Linux malloc大内存的方法

本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9963199

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


在项目中遇到一个问题,需要malloc一段很大的虚存空间,远大于物理内存的大小。


初始情况下,使用malloc声明一块很大的虚拟内存空间通常会成功,但是在使用时会产生问题:

#include <stdio.h>

int main()
{
    size_t size1 = 40000000000;
    int *mem = (int *)malloc(size1);

    memset(mem, 0, size1);

    free(mem);
    return 0;
}


例子中声明了40g的虚存空间,机器的物理内存是6*4g=24g,不进行memset时是可以成功的,但是memset的过程中会产生段错误。如图所示:


查看系统内存情况:


malloc函数实际调用sbrk,mmap系统调用,完成虚存空间的分配,大于128k均使用mmap。在物理内存不再扩展的前提下,解决这个问题有两个办法:

1. 扩展swap区,利用大的硬盘空间,绕过这个问题

2.增大overcommit内存的限制



扩展swap区

对于第一种情况,步骤如下:

1.创建一个用于交换的磁盘文件:

dd if=/dev/zero of=/pps/guohongwei/my_swap bs=1M count=20000

2.设置swap区文件:

mkswap /pps/guohongwei/my_swap

3.启用该分区:

swapon /pps/guohongwei/my_swap

4.若想开机启用该swap,可以设置/etc/fstab:

/home/swapfile swap swap defaults 0 0


整体流程如图:


观察可见,swap空间比之前多了20g



增大overcommit限制

有关linux overcommit的说明看这里

查看当前系统overcommit:


0.首先将swap区恢复为系统默认情况,解除swap文件

swapoff /pps/guohongwei/my_swap

1.通过修改overcommit_memory的值,声明内存分配的方式:

sysctl vm.overcommit_memory=1

2.修改overcommit_ratio大小,确定可以分配的虚拟空间的大小:

sysctl vm.overcommit_ratio=500

搞定,查看系统当前的overcommit:



通过以上两种方式,均可以用malloc声明比本机物理内存大很多的虚存空间,以满足笔者需求。

原文地址:https://www.cnblogs.com/riskyer/p/3258330.html