Linux 为什么这么多应用程序在不使用任何虚拟内存的情况下分配了难以置信的大量虚拟内存?

Linux 为什么这么多应用程序在不使用任何虚拟内存的情况下分配了难以置信的大量虚拟内存?,linux,memory,memory-management,Linux,Memory,Memory Management,我在编程中观察了一些奇怪的现象已经有相当一段时间了,因为linux系统默认启用了Overmit 在我看来,几乎所有的高级应用程序(例如,用java、Python或C++语言编写的高级应用程序,包括一些用C++编写的桌面应用程序,使用大型库,如QT),使用的虚拟操作内存非常疯狂。例如,web浏览器通常分配20GB的ram,而只使用300MB。或者对于dektop环境,mysql服务器,几乎所有java或mono应用程序等等,都可以分配数十GB的RAM 为什么会这样?重点是什么?这有什么好处吗 我注

我在编程中观察了一些奇怪的现象已经有相当一段时间了,因为linux系统默认启用了Overmit

在我看来,几乎所有的高级应用程序(例如,用java、Python或C++语言编写的高级应用程序,包括一些用C++编写的桌面应用程序,使用大型库,如QT),使用的虚拟操作内存非常疯狂。例如,web浏览器通常分配20GB的ram,而只使用300MB。或者对于dektop环境,mysql服务器,几乎所有java或mono应用程序等等,都可以分配数十GB的RAM

为什么会这样?重点是什么?这有什么好处吗


我注意到,当我在linux中禁用Overmit时,如果一个桌面系统实际上运行了很多这样的应用程序,系统就变得不可用,因为它甚至不能正常启动。

这些应用程序通常有自己的内存管理方法,它针对其自身使用进行了优化,比系统提供的默认内存管理更有效。因此,他们分配巨大的内存块,以跳过或最小化system或libc提供的内存管理的影响。

在虚拟机中运行代码的语言(如Java(*)、C#或Python)通常在启动时分配大量(虚拟)内存。其中一部分是虚拟机本身所必需的,另一部分是预先分配给虚拟机内部的应用程序的

对于在直接操作系统控制下执行的语言(如C或C++),这是不必要的。您可以编写只动态使用实际需要的内存量的应用程序。然而,一些应用程序/框架的设计方式仍然是,它们一次从操作系统请求一大块内存,然后自己管理内存,希望比操作系统更高效

这方面存在问题:

  • 它不一定更快。大多数操作系统在如何管理内存方面已经相当聪明了。规则#1优化,测量,优化,测量

  • 并非所有操作系统都有虚拟内存。有一些功能相当强大的应用程序无法运行,它们“粗心”地假设您可以分配大量&大量“非真实”内存而不会出现问题

  • 您已经发现,如果您将操作系统从“慷慨”改为“严格”,那么这些内存消耗者将一败涂地



例如,(*)Java一旦启动就无法扩展其VM。您必须将VM的最大大小作为参数(
-Xmxn
)。认为“安全总比遗憾好”会导致某些人/应用程序严重超额分配。

好吧,但java并不仅仅在linux上使用。现在每个操作系统都启用了过度限制吗?如果不是(我怀疑会是),这些操作系统怎么可能也运行这些程序,而在禁用Overmit的linux上似乎不可能(实际上我禁用Overmit时甚至无法启动操作系统,内存需求非常巨大)。@Petr:“Overmit”--传递的虚拟内存比物理内存多--这确实是Windows和Linux的默认设置。这足以让许多开发人员不再为计算世界的其他部分操心。例如,Amiga OS 3.x就是其中一个没有“做”虚拟内存的操作系统,而那个操作系统也从来没有“做”过Java。