本博文为原创,遵循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声明比本机物理内存大很多的虚存空间,以满足笔者需求。

Linux malloc大内存的方法的更多相关文章

  1. 【转】Linux内核中分配4M以上大内存的方法

    在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order & ...

  2. linux内核中分配4M以上大内存的方法

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  3. linux内核中预留4M以上大内存的方法

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  4. Java的大内存分页支持

    原文:http://kilik.iteye.com/blog/677253 最近在研究java的性能调优,顺手写了一个小程序来测试性能问题.这个程序用来进行矩阵乘法运算,如下: for (int i ...

  5. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  6. 转: Linux C 动态内存分配 malloc及相关内容 .

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  7. 在 Linux 平台中调试 C/C++ 内存泄漏方法(转)

    由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误.同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果.本文将从静态分析和动态检测两 ...

  8. linux 内存查看方法:meminfo\maps\smaps\status 文件解析

    linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍 ...

  9. Linux C 动态内存分配--malloc,new,free及相关内容

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

随机推荐

  1. MVC Razor中 如何截断字符串

    有时候显示的内容过长,使用MVC编程时,如何截断显示的内容呢.我知道你肯定有很多办法这样做的,但是在学习MVC时,还是使用一些新的办法做吧> Razor 标记语法编程. @helper Trun ...

  2. Lowest Common Ancestor of a Binary Search Tree (BST)

    Given a binary search tree(BST), find the lowest common ancestor of two given nodes in the BST. Node ...

  3. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  4. php mysql实现栏目分类递归

    header("content-type:text/html;charset=utf-8"); $dbhost = "localhost";   // 数据库主 ...

  5. Githut Token (hidden): Githut 安装验证

    登录https://github.com 进入https://github.com/settings/profile 参考 http://jingyan.baidu.com/article/22fe7 ...

  6. 利用python进行数据分析之数据聚合和分组运算

    对数据集进行分组并对各分组应用函数是数据分析中的重要环节. group by技术 pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组,拆分操作是在对象的特定轴上执行的,然后将一个函数应用 ...

  7. Cubieboard 关闭板载led

    修改script.bin  找到最后节点[led_para] 修改leds_used = 0 script.bin 一般在系统盘的第一个分区 例如nand就在/dev/nanda sdcard就在/d ...

  8. QT实现TCP通信服务器端和客户端(支持多个客户端)精简版

    上星期接了个私活,工期两星期,报酬3000,写一个小软件,采集定向网络上的数据,并进行双向通信,捣鼓了两天,终于把QT中tcp通信这块调通了,找过N多例子,绝大部分都是基本的一个服务端一个客户端通信的 ...

  9. HDU 1722 Cake

    #include<cstdio> int gcd(int m, int n) { ?n:gcd(n % m, m); } int main() { int m, n; while(scan ...

  10. c#简单的调试信息、日志信息输出

    public static void ErrorLog(string mssg) { string FilePath = "D:/logs/ErrorLog.txt"; try { ...