本博文为原创,遵循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# 基础知识系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  2. linux线程之pthread_join

    pthread_join使一个线程等待另一个线程结束. 代码中如果没有pthread_join:主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了.加入pthread_joi ...

  3. C++运算符详解问题详解

    有关C++运算符的细节,先来看一个题目: int main() { int a[] = {2, 4, 6, 8, 10}, *p, **k; p = a; k = &p; printf(&qu ...

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

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

  5. JAVA 对象内存分析

    1.jmap -heap pid 或者 jmap -histo pid 2.jmap -dump:file=folder/dumpFileName.txt,format=b pid 3.对3的输出文件 ...

  6. Android 开发笔记“关闭默认键盘”

    1.打开AndroidManifest.xml文件 2.在对应的activity中增加配置信息 android:windowSoftInputMode="stateHidden"

  7. 10.PHP 教程_PHP If...Else 语句

    条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP 中,提供了下列条件语句: if 语 ...

  8. https tomcat 证书搭建

    首先生成证书说明 keytool -genkey -alias castest -keyalg RSA -keystore c:/keys/caskey 先让输入密码,密码必须记住,下面会用到 其中“ ...

  9. mybatis日记配置Log4j

    拷贝log4j-1.2.16.jar到项目lib下 方式一是在src下新建一个log4j.xml文件,其具体内容如下 <?xml version="1.0" encoding ...

  10. STL deque详解

    英文原文:http://www.codeproject.com/Articles/5425/An-In-Depth-Study-of-the-STL-Deque-Container 绪言 这篇文章深入 ...