0

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

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

所以我想其他东西一定在限制我。也许有人遇到过类似的问题并且知道改变限制的方法?

4

1 回答 1

2

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

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

于 2013-08-29T09:19:40.110 回答