本博文为原创,遵循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. C# 委托和方法

    委托是一种特殊的引用类型,它将方法也作为特殊的对象封装起来,从而将方法作为变量或参数进行传递 using System; using System.Collections.Generic; using ...

  2. C#中窗体的一些简单运用(Sixteenth Day)

    从今天开始,我们进入到学window form的知识,今天简单的学习了一些控件和事件的运用.没有什么很全面的理论,所以今天就总结下所写的程序.一个简单的注册页面程序 注册页面程序 要求: 1:修改所有 ...

  3. iOS 设置状态栏的颜色

    1.在plist文件中设置如下属性: 2.在delegate中设置 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarSt ...

  4. Windows 配置JAVA的环境变量

    Java是由Sun公司开发的一种应用于分布式网络环境的程序设计语言,Java语言拥有跨平台的特性,它编译的程序能够运行在多种操作系统平台上,可以实现“一次编写,到处运行”的强大功能. 工具/原料 JD ...

  5. 建造者模式->代码示例

    <?php interface Builder{ public function head(); public function body(); public function foot(); ...

  6. divmod数字处理函数

    divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: a,b可以为数字(包括复数) 版本: 在python2 ...

  7. ThinkPHP 3.1.2 视图-2

    一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl) 更换模板文件 ...

  8. 关于DLL搜索路径顺序的一个问题

    DLL的动态链接有两种方法.一种是加载时动态链接(Load_time dynamic linking).Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SY ...

  9. debian安装vld来查看Opcode,PHP调优。

    一: 我的环境: Debian 7 (wheezy)  x64 PHP 5.4.4-14 (apt-get 而来) Apache/2.2.22 (同上,非源码编译) 二 :安装vld. (# 代表是r ...

  10. js 模板引擎 jade使用语法

    Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...