2013-05-28 32 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