2013-05-28 38 views
3

我注意到了这个多国语言,包括为什么虚拟内存分配是远远高于居民的内存分配更高的解释语言

  • C#
  • 的Java
  • 的Python
  • JS

和许多其他正在被解释器解释的语言(并且通常有一个垃圾收集器)。

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

这不是c或C++等语言的情况。

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

或样品(这实际上是真实的数据) C#应用MonoDevelop的使用驻留内存,但虚拟内存

的1661MB的136MB也有鲁棒C++应用程序异常,例如火狐似乎有同样的问题,并据我所知它也使用垃圾回收器以及

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

这是为什么?

+0

除此之外,它取决于多少库代码被拉入。 –

回答

0

您引用的30 MB虚拟翻译为2 GB的虚拟不是普遍规律。

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

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

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

也许他们不太常见是多线程的,所以他们错过了这个贡献。链接共享库与加载JAR不同。

我认为所有这些因素都可能解释不同之处。

+0

是的,你是正确的,这不是一个/每个/进程的情况下,但他们中的大多数,确实比常驻内存吃更多的Vmem ... – Petr

+0

我会说总的驻留内存>堆内存*的定义*。这并不令人意外。超过堆的数量因应用程序而异。 – duffymo