c++ - 使用 C++ 在 32 位 Linux 中查找进程可用的剩余内存

标签 c++ linux memory process

我的 C++ 程序缓存了大量对象,在每次主要 API 调用开始时,我想确保至少有 500 MB 可用于 API 调用。我可能用完了 RAM + 交换空间(考虑具有 1 GB RAM + 1 GB SWAP 文件的系统),或者我可能在我的进程中用完了虚拟地址。(我可能已经使用了总计 4GB 中的 3.7 GB地址空间)。估计缓存了多少数据对我来说并不容易,但如果它成为一个问题,我可以清除其中的一些,并反复这样做,直到我在系统或地址空间中有 500 MB 可用(无论哪个成为瓶颈)。所以我的要求是在 32 位 Linux 上用 C++ 找到:

A) 找出有多少 RAM + SWAP 空间是空闲的。
B) 有多少用户空间地址空间可供我的进程使用。
C)进程已经使用了多少虚拟内存。将其视为类似于 Windows 上进程的“提交大小”或“工作集大小”。

如有任何答案,我们将不胜感激。

最佳答案

查看/proc/vmstat 有很多关于系统范围内存的信息。

/proc//maps 会给你很多关于进程内存布局的信息。

请注意,如果您在运行长时间作业之前检查内存,另一个进程可能会吃掉所有可用内存,您的程序可能会崩溃!

我对您的缓存类一无所知,但如果这些对象非常小,您可能已经覆盖了新/删除运算符。通过这个很容易跟踪内存消耗(至少通过计算对象) 为什么不更改缓存策略?并清除旧的未使用对象。

另一种丑陋的方法是尝试分配几 block 内存并查看程序是否可以分配它,然后释放它。在 32 位上,它可能会失败,因为堆可能是碎片化的,但如果它能工作,你确定此时你有足够的内存。

关于c++ - 使用 C++ 在 32 位 Linux 中查找进程可用的剩余内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4488990/

相关文章:

linux - 排序文件并将它们放在不同的文件中

xml - Haskell解析低内存的大xml文件

带有 ARC 的 iOS 应用程序,查找对象的所有者

c++ - 将 "third party" header 包含到 C++ 项目的最佳方法是什么

c++ - 使用图表的机场旅行

c++ - Linux 中的双 UDP 套接字绑定(bind)

linux - 为什么在有可用的 PIT 时需要 TSC

c++ - 重新实现 QThread 的 start()

c++ - 获取从无符号到有符号的隐式转换溢出警告

针对 CPU 和内存使用的 GCC 优化