Linux下CLion+CMake+Ninja构建占满内存,如何限制内存占用?
限制CLion+CMake+Ninja构建及重载过程的内存占用(Linux)
1. 精准控制Ninja并发编译数
之前加-j4没生效,大概率是参数传递方式不对,试试这几种可靠的配置方式:
- 在CLion的
Settings -> Build, Execution, Deployment -> Build Tools -> CMake里,Build options中添加:-- -j4,双横线是用来分隔CMake自身参数和传给Ninja的参数,确保Ninja实际使用4个并发任务。 - 或者直接设置CMake全局并发变量:在CMake选项里加
-DCMAKE_BUILD_PARALLEL_LEVEL=4(CMake 3.12及以上版本支持),这个变量会自动传递给Ninja、Make等所有构建工具。 - 也可以通过环境变量生效:在CLion的
Run/Debug Configurations里的Environment Variables中添加NINJAJOBS=4,或者在启动CLion前执行export NINJAJOBS=4。
2. 降低CMake重载时的内存消耗
- 关闭自动重载:在CLion的CMake设置里,取消勾选
Reload CMake project automatically,手动触发重载(比如修改CMakeLists.txt后按Ctrl+Shift+F9),避免频繁触发不必要的CMake配置过程。 - 拆分大型项目:如果项目文件极多,把它拆分成多个子模块,用
add_subdirectory分模块处理,减少单次CMake配置需要加载和处理的文件量,从根源降低内存占用。
3. 系统层面限制进程内存上限
如果上面的方法还不够,直接从系统层面限制CLion及其子进程的内存使用:
- 临时限制:启动CLion前执行
ulimit -v 25165824(单位KB,对应24GB虚拟内存),这样CLion、CMake、Ninja和编译器的总虚拟内存不会超过这个值,达到上限后会触发OOM Killer(但不会直接冻机)。 - 持久化限制(用systemd):用
systemd-run启动CLion时直接设置内存上限:systemd-run --user --property=MemoryMax=24G /path/to/clion.sh - 更灵活的cgroups限制(需要root权限):
# 创建内存限制的cgroup sudo mkdir -p /sys/fs/cgroup/memory/build-limit sudo echo 24G > /sys/fs/cgroup/memory/build-limit/memory.limit_in_bytes # 找到CLion的PID,假设是12345 pidof clion.sh # 将CLion进程加入cgroup sudo echo 12345 > /sys/fs/cgroup/memory/build-limit/cgroup.procs
4. 编译器层面优化内存占用
如果编译单个文件时内存占用过高,调整编译选项:
- 若使用LTO(链接时优化),把
-flto=full改成-flto=thin,Thin LTO的内存消耗远低于Full LTO;或者添加-fno-fat-lto-objects减少中间文件的内存占用。 - 关闭不必要的调试信息或优化选项:比如暂时关闭
-g3(改用-g1)、-O3(改用-O2),能有效降低编译时内存使用。
内容的提问来源于stack exchange,提问作者Eivyses
相关产品推荐
相关产品推荐

