【问题标题】:C++: Request more than 2GB of memoryC++:请求超过 2GB 的内存
【发布时间】:2013-01-14 17:16:17
【问题描述】:

我有以下代码:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

typedef uint64_t     Huge_num;  // 8 bytes
typedef Huge_num *   Huge_Arr; // Array of 8 byte elements

using namespace std;

// Function: Return a huge array
static Huge_Arr* requestMem(int n)
{
   cout << "requesting :" 
        << (sizeof(Huge_num)*n)/(1024*1024*1024) 
        << "GB" << endl;

   Huge_Arr *buff;
   try {
      buff = new Huge_Arr[n];
   }
   catch (bad_alloc){
      cout << "Not enough mem!" << endl; 
      exit(-1);
   }
   return buff;
}

// Main
int main(){
    for (int i=1; i< 10; i++){
         Huge_Arr *mem = requestMem(i*90000000);
         delete mem;
    }
}

由于某种原因,malloc 在抛出 bad_alloc() 错误之前只能获取不超过 2GB 的内存。

我知道在 32 位系统上,最大地址空间确实在 2GB 的相同数量级。

但我使用的是 Ubuntu 12.04 x86_64,应该能够处理更大的内存请求,对吧?

编辑:原来答案是我使用g++ -std=c00x 编译,它是 32 位的?不确定,无论哪种方式,我都更改了 Makefile 以删除 -std 标志,并且编译正常

【问题讨论】:

  • 您的程序是否编译为 64 位程序?您可能将其编译为 32 位程序,因此尽管它在 64 位系统上运行,但仍被限制为 ~2GB 的可寻址空间。
  • 你没有使用malloc,你使用的是new。您的代码无法针对与您的问题完全无关的问题进行编译。例如,您使用 n 而不定义它。你真的可以编写一个小型的自包含程序来实际编译并实际演示你的问题吗?
  • 哦,从&lt;cstddef&gt; 中检查sizeof(std::size_t)——这是一种简单的方法来查看您是在为 64 位还是 32 位系统进行编译(假设 char 是 8 位,并且编译器并不傻)。
  • 也许它找不到足够大的连续内存块。
  • @tetris11:在 UNIX-y 系统上,您可以从命令行执行 file &lt;name-of-your-executable&gt; 以查看它是 32 位还是 64 位。 std::size_t 在 64 位程序中至少应为 8,但在技术上(据我所知)它在 32 位程序中为 8 也是可行的。无论如何,你的程序在我的系统上运行良好(我没有耗尽内存),但我也在 64 位编译并且有大量可用 RAM(并且 OS X 可能会过度使用内存;我我不确定)。

标签: c++ memory memory-management


【解决方案1】:

malloc 正在分配连续内存。您收到badalloc 请求 2 GB 内存的事实并不一定意味着您的可用内存少于 2 GB,也可能意味着可用内存是碎片化的。如果您想测试系统上有多少内存可供分配,请尝试分配较小的块。

【讨论】:

  • 问题是我在 32GB 64 位服务器上尝试了相同的代码并且得到了相同的结果。这样的系统肯定会有大量未碎片化的内存
【解决方案2】:

如果您增加了swap space 的大小,则可能有更多空间用于分配,当RAM 没有足够的内存时,操作系统会通过与disk space 交换来增长heap space,因此您可能会为此更改交换文件的大小,这个链接解释得最好:

All about Linux swap space

其他最好的方法是打开overcommittingon,如果overcommitting值设置为off,你不能分配你系统上的所有内存,打开overcommittingon,您可以为您的数组分配所有内存空间。

overcommitting 值设为on

/proc/sys/vm/overcommit_memory 设置为0

【讨论】:

  • 好吧,这是有道理的——但我该如何在 Ubuntu/Debian 上做到这一点?
  • 但这只是交换空间。只要我的 RAM 足够大,就不需要发生分页。我有 32 GB 内存。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 2013-03-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2011-08-30
相关资源
最近更新 更多