4

我注意到许多语言的这一点,包括

  • C#
  • 爪哇
  • Python
  • JS

以及由某些解释器(通常具有垃圾收集器)解释的许多其他语言。

当我检查系统(unix)上的内存使用情况时 - 任何系统(我在许多不同的服务器上都尝试过)。我可以看到分配的虚拟内存和常驻内存(实际被吃掉的真实物理内存)之间的巨大差异。

这不是像 c 或 c++ 这样的语言的情况。

例如,使用 30mb 常驻内存的 java 应用程序可以使用 2gb 的虚拟内存,这也适用于其他解释语言。当然这不会每次都发生(在所有情况下差异都不是很大),但在大多数情况下它相当大。

或示例(这实际上是真实数据)ac# 应用程序 MonoDevelop 使用 136MB 的常驻内存但 1661MB 的虚拟内存

健壮的 C++ 应用程序也有例外,例如 firefox 似乎也有同样的问题,据我所知,它也使用垃圾收集器

对于每个基于虚拟内存限制内存的系统来说,这都是一个问题(这实际上是一种正确的方法,因为操作系统应该保证分配给进程的虚拟内存量实际上可用于该进程)。

这是为什么?

4

1 回答 1

0

您将 30 MB 虚拟转换为 2 GB 虚拟的引用并不是普遍规律。

我习惯于部署到 Java EE 容器(例如 JBOSS)的 Java 应用程序。容器本身就是一个应用程序。它将大量 JAR 加载到堆外的驻留内存中。整个 JAR 被加载,而不仅仅是所需的几个类。所有这些都有助于总驻留内存。

对总常驻内存还有其他贡献。例如,每个创建的线程都会为其线程堆栈获取约 1 MB 的内存。结果,多线程代码将占用更多内存。

大多数 C/C++ 应用程序都编译为 .exe 并在操作系统控制下自行运行。没有虚拟机需要考虑,所以这总是对他们有利。您引用的所有基于 VM 的语言都是如此。

也许它们是多线程的不太常见,因此它们缺少这种贡献。链接共享库不同于加载 JAR。

我认为所有这些因素都可以解释这种差异。

于 2013-05-28T14:01:19.717 回答