【问题标题】:Why so many applications allocate incredibly large amount of virtual memory while not using any of it?为什么有这么多应用程序分配了难以置信的大量虚拟内存而不使用任何虚拟内存?
【发布时间】:2015-10-29 11:21:46
【问题描述】:

很长一段时间以来,我一直在观察编程中的一些奇怪现象,因为在 Linux 系统上默认启用了过量使用。

在我看来,几乎每个高级应用程序(例如,用 Java、Python 或 C# 等高级编程语言编写的应用程序,包括一些用 C++ 编写的使用 Qt 等大型库的桌面应用程序)都使用大量虚拟操作记忆。例如,Web 浏览器分配 20GB 内存而仅使用 300MB 是正常的。或者对于 dektop 环境,mysql 服务器,几乎每个 java 或 mono 应用程序等,分配数十 GB 的 RAM。

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

我注意到,当我在 linux 中禁用 overcommit 时,如果桌面系统实际运行大量此类应用程序,系统会变得不可用,因为它甚至无法正常启动。

【问题讨论】:

    标签: linux memory memory-management


    【解决方案1】:

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

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

    这有问题:

    • 不一定更快。大多数操作系统在管理内存方面已经非常聪明了。优化规则 #1,衡量、优化、衡量

    • 并非所有操作系统都拥有虚拟内存。有一些非常有能力的应用程序无法运行那些在假设您可以毫无问题地分配大量“非真实”内存时如此“粗心”的应用程序。

    • 您已经发现,如果您将操作系统从“慷慨”变为“严格”,这些内存猪就会一头雾水。 ;-)


    (*) 例如,Java 一旦启动就无法扩展它的虚拟机。您必须将 VM 的 最大 大小作为参数 (-Xmxn)。认为“比后悔更安全”会导致某些人/应用程序严重过度分配。

    【讨论】:

    • 好的,但 java 不仅仅用于 Linux。这些天,是否在每个操作系统上都启用了过量使用?如果不是(我怀疑它会是)这些操作系统怎么可能也运行这些程序,而在禁用过度使用的 Linux 上似乎不可能(我什至无法启动操作系统)我禁用了过度使用,内存需求非常大)。
    • @Petr:“Overcommit”——传递的虚拟内存多于物理内存——确实是 Windows 和 Linux 上的默认设置。这足以让许多开发人员不再关心计算世界的其他部分。没有“做”虚拟内存的操作系统之一是,例如,Amiga OS 3.x——而那个操作系统也从来没有“做”过 Java。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2020-07-18
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多