减少 gcc 内存使用

Posted

技术标签:

【中文标题】减少 gcc 内存使用【英文标题】:Reduce gcc memory usage 【发布时间】:2017-04-17 03:39:27 【问题描述】:

目前我必须在非常有限的硬件上构建一个相当大的项目(一个只有 2gb RAM 的核心 i5)。当使用 4 线程 gcc 运行 make 时,由于每个线程占用了高达 40% 的 RAM,因此崩溃。 我用谷歌搜索了一下,发现了这个link。一些人反馈它有效。但是,不是我。

这就是我的做法。

/usr/bin/qmake-qt4 -r -spec linux-g++ $DEBUG_FLAGS -o Makefile "QMAKE_CXXFLAGS +=  --param ggc-min-expand=10 --param ggc-min-heapsize=8192"  /home/build-srv/LargeProject/largeProject.pro

make 输出确实有标志:

g++ -c -pipe --param ggc-min-expand=10 --param ggc-min-heapsize=8192 -std=c++11 -std=c++11 -g -Wall -W -D_REENTRANT -fPIC -D_GLIBCXX_USE_CXX11_ABI=0 -DBASE_LIBRARY -DQT_DECLARATIVE_DEBUG -DQT_DECLARATIVE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++  -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtDeclarative...

但是 ram 的使用还是一样的。唯一的方法是减少到单线程构建,这非常慢。

我做错了什么?有没有更好的解决方案。

更新

是的,硬件部门将 RAM 容量“升级”到 4GB,现在它在构建项目时可以响应。(实际上是一根棍子坏了,所以他们需要等待更换)。但我很好奇,在像 VPS 这样的有限资源系统中,我们该如何处理呢? (除了减少构建线程?) 我将搜索编译/链接时占用大量 RAM 的文件。我不记得名字了,因为那不是我的模块。 构建服务器有 2GB 的交换空间。

【问题讨论】:

你有大的源文件吗?很多模板?许多包含的头文件?如果您对源文件进行预处理,它们(通常)有多大? 明天早上去再买 4 GB。 CPU 周期和 RAM 不能凭空创建。如果您没有足够的 RAM 来进行四个并发编译,则将其调低到 3 或 2,或者许多可以放入 RAM。 gcc 并没有无缘无故耗尽大量 RAM 的名声。人为地减少它可以使用的 RAM 意味着编译相同的源代码需要更长的时间,因此,最终,您可能最终会成功运行四个并发编译周期,但是如果您要让 gcc 使用所有它想要的 RAM,并且一次编译两个,它可能需要相同的时间来完成它。 您是否至少配置了一些交换空间?这样可以避免将部分 RAM 浪费在未使用的东西上。 很抱歉回复晚了,我更新了问题以提供您需要的信息。 【参考方案1】:

告诉您的雇主,他们为您的工作提供的工具不足。对于你正在做的事情来说,这是一个系统的玩笑,我认为它是由雇主提供的。毫无疑问,您需要更多的 RAM。扩展内存应该很简单,没有i5主板最多只能2G。

否则 - 是的,您需要限制线程数,例如使用make -j2 甚至make -j1. 现代编译器需要大量内存不是因为它们浪费,而是因为它们一次将整个翻译单元的信息价值保存在内存中以提供全局优化。链接时代码生成将需要更多内存,因为它包含有关整个应用程序的信息。

【讨论】:

我遇到了 gcc 使用超过 8GB 内存的问题 :(。我不知道该怎么办,2 个文件会导致这种情况。

以上是关于减少 gcc 内存使用的主要内容,如果未能解决你的问题,请参考以下文章

linux动态库问题

GCC优化内存访问[重复]

gcc/linux:CppuTest 使用静态向量显示内存泄漏,误报?

GCC 向量扩展的内存对齐问题

UIPageControllerView 回收页面减少内存使用

gcc需要很多内存来编译堆栈上具有非常大的对象的c ++文件