【问题标题】:Compilation hitting virtual memory limitation in g++ 4.7.1?编译在 g++ 4.7.1 中达到虚拟内存限制?
【发布时间】:2013-09-01 14:48:40
【问题描述】:

我正在编译一些大量使用模板的代码(它基于 boost::msm 框架)。当使用 g++ 4.7.1 编译时,cc1plus 进程达到大约 2.4 Gb 的 RAM 大小并且失败并出现“虚拟内存耗尽:无法分配内存”错误。

我使用的是 32 位编译器(切换到 64 位不是 ATM 的选项),机器本身是 64 位 Ubuntu,具有 16Gb 的 RAM,编译是在 Debian 的 64 位 chroot 下执行的喘息的分布。在编译时有大量可用的 RAM,因此如果由于缺少可用的物理 RAM 而导致编译失败,则首先要达到 4Gb。我尝试使用“ulimit -m”选项,设置为不同的值并将其设置为较小的大小会导致编译器提前失败,但是当设置为“无限”时,它会在上述 2+ Gb 时失败。

所以我想肯定是有别的东西限制了我。也许有人遇到过类似的问题并且知道改变限制的方法?

【问题讨论】:

  • “切换到 64 位”,你的意思是使用 GCC 本身的 64 位构建还是使用 GCC 构建 64 位可执行文件?
  • 我的意思是使用 64 位 g++

标签: c++ memory boost compiler-errors virtual-memory


【解决方案1】:

在 32 位应用程序(包括编译器)中,您通常会在 2 到 3GB 之间获得可用于虚拟空间中的用户模式的空间。这是由保留的内存空间、内存空间碎片(有可用的虚拟内存,只是没有足够大的块来容纳newmalloc 请求的任何大小的块)和“内存保留”的组合引起的,其中进程分配了相当大的内存块,但实际上并没有使用全部,所以它没有“填充”。

您不能使用 64 位 GCC 生成 32 位代码的任何特殊原因 - 使用 -M32?那将是我的解决方案。

【讨论】:

  • 您的解释非常符合我的观察 - 实际大小各不相同。我将使用 64 位 GCC 来生成 32 位代码,或者使用其他一些技术来减少编译大小..
  • 如果您在 64 位中使用相同版本的 gcc,它应该生成与 32 位构建相同的代码(我使用 32 位 GCC 构建 64 位二进制文​​件,当时64位操作系统还处于起步阶段,所以在64位版本的操作系统中不能依赖编译器来完成!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2019-08-25
  • 2012-08-28
  • 2012-05-14
相关资源
最近更新 更多