为啥 Linux 报告我的应用程序的内存使用量太大?
Posted
技术标签:
【中文标题】为啥 Linux 报告我的应用程序的内存使用量太大?【英文标题】:Why does Linux report the memory usage of my application too be so large?为什么 Linux 报告我的应用程序的内存使用量太大? 【发布时间】:2017-05-30 02:56:22 【问题描述】:我花了很多精力来确保我编写的 C++ 应用程序占用的内存非常少。然后我运行了 top (和其他类似的 Linux 命令)并且很失望地看到我的应用程序占用的比我想象的要多。我花了一些时间挖掘那段记忆的去向,但这有点徒劳无功。我终于写出了我能想到的最简单的应用程序:
int main()
for(;;)
;
并在上面跑了。 Top 报告说我的极简应用程序消耗了 728K RES 和 4,224K VIRT!当我使用 clang++ 而不是 g++ 时,增加到 1,612K RES 和 13,264 VIRT!有没有搞错?我记得以前的 DOS 时代,应用程序不能超过 640K。现在一个简单的空 for 循环需要的还不止这些?显然我错过了一些东西。这是什么?
顺便说一句,我正在运行 Mint 8.1。
【问题讨论】:
您忘记了您的程序不仅仅包含main()
。它与 C 和 C++ 标准库链接。
fefe.de/dietlibc
所以当我新建 100 个大小为 4 字节的对象时,大小增加到 1720K RES 和 13,268K VIRT。为什么分配 400 字节会使我的内存使用量增加约 1M?
@user545226,对于 动态 内存分配,您的实现使用的内存分配系统(operator new
、malloc
等使用的任何系统)通常会请求更多内存来自操作系统的请求超出了您的要求,这可以防止在需要内存时始终进行系统调用。并且删除对象也不一定会返回内存。另一方面,编译器可能会针对不同的程序进行不同的优化。即使区别在于两个对象的声明顺序
【参考方案1】:
首先,您的最小程序调用未定义行为。是的,infinite loop in C++ invokes Undefined Behavior。
更重要的是,main()
在您的程序中通常是 not the first function executed。设置了很多结构,全局对象可能会或可能不会在 main 之前初始化。
默认情况下,您的工具链(至少是流行的)将链接其他库,包括(但不限于):
您的工具链的 C++ 运行时库(通过一些基本服务支持您的 C++ 程序) C++ 标准库,很可能也是 C 标准库 您的操作系统库(您的程序如何与控制台通信?) 可能还有更多。您的可执行文件本身将包含一些额外的结构,以使操作系统能够将您的程序加载到内存中,解析要加载的外部库等等。
【讨论】:
Gnome-calculator 报告 37,640K RES 和 539,504K VIRT。 我不是故意按回车的,它不会让我编辑超过 5 分钟的评论。我的意思是像 gnome-calc 这样的简单应用程序有那么大,那么我想知道一个更复杂的应用程序会有多大。我希望在 android 上运行我的 Qt 应用程序,但现在我担心它可能会变得太大。 @user545226,对不起,朋友,在这个行业,你不应该总是投机取巧。我们也无法帮助您推测。我确实说过你应该先尝试一个简单的,然后观察行为。 标准 C++ 库实际上是否只在整个操作系统中加载一次,因为它是一个共享库?如果是这样,有没有办法告诉我有多少内存专门用于我的应用程序? (我说的是代码,而不是内部静态变量之类的东西。) @user545226,这取决于您的编译标志和/或工具链选项...可以静态链接工具链的 C++ 标准库。也可以由不同的应用程序在内存中加载不同 C++ 标准库的多个副本...以上是关于为啥 Linux 报告我的应用程序的内存使用量太大?的主要内容,如果未能解决你的问题,请参考以下文章
我在虚拟机中装Linux Mint操作系统,但占内存太大,内存使用都能达到90%,请问那个版本的Linux在虚拟机中
deepin linux 做了哪些优化?ubuntu12.04开机后内存占用与CPU占用均不低,deepin linux 就很小.这是为啥?