为什么虚拟内存分配远远高于解释语言的驻留内存分配

时间:2013-05-28 13:53:38

标签: memory

我注意到这种语言很多,包括

  • C#
  • 爪哇
  • 的Python
  • JS​​

和许多其他语言被某些解释器解释(通常有垃圾收集器)。

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

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

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

或样本(这实际上是真实数据) 一个c#应用程序MonoDevelop使用136MB的驻留内存但是1661MB的虚拟内存

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

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

为什么?

1 个答案:

答案 0 :(得分:0)

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

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

还有其他对总驻留记忆的贡献。例如,创建的每个线程都为其线程堆栈获取大约1 MB的内存。因此,多线程代码将占用更多内存。

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

对他们来说,多线程可能并不常见,因此他们缺少这种贡献。链接共享库与加载JAR不同。

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