zoukankan      html  css  js  c++  java
  • 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声明比本机物理内存大很多的虚存空间,以满足笔者需求。

  • 相关阅读:
    Redis订阅和发布模式和Redis事务
    Redis介绍和环境安装
    Redis基本数据类型
    MongoDB导入导出以及数据库备份
    MongoDB-python的API手记
    MongoDB对应SQL语句
    判断是否微信浏览器访问并得到微信版本号
    windows 下编译php扩展库pecl里的扩展memcache
    用PHPExcel类读取excel文件的内容
    用excel.php类库导出excel文件
  • 原文地址:https://www.cnblogs.com/riskyer/p/3258330.html
Copyright © 2011-2022 走看看