c++ - 编译在 g++ 4.7.1 中达到虚拟内存限制?

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

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

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

所以我想一定是其他原因限制了我。也许有人遇到过类似的问题并且知道更改限制的方法?

最佳答案

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

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

关于c++ - 编译在 g++ 4.7.1 中达到虚拟内存限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506375/

相关文章:

c++ - 如何检查 vector 中是否不存在元素?

c++ - 有哪些对二进制打包结构消息进行版本控制的好方法?

memory - 为什么 Coldfusion 10 立即占用 50% 的可用 RAM,而没有任何运行?

java - 在 Docker 容器中运行的 JVM 的驻留集大小 (RSS) 和 Java 总提交内存 (NMT) 之间的差异

c++ - 如何编译 Boost.Process 库?

c++ - 你能从 C++ 程序连接到 Socket.IO 吗?

django+uwsgi 巨大的内存使用问题

c++ - 对 std::runtime_error 的 what() 函数的误解

c++ - boost asio async_read_some 超时

c++ - 通过引用传递带有枚举类的枚举