2012-03-15 83 views
1

java -Xms顯然不會影響java進程在運行過程中消耗的內存量。64位java 1.7是否忽略最小堆大小標誌?

我有一個應用程序,從系統角度來看消耗約1Gb。我嘗試設置-Xms2048m(和-Xmx4096m),我發現內存消耗完全沒有變化。

熱點文檔聲明堆大小由Xms值或默認值限定。

我能想到的唯一可能是這個進程無法獲得連續的內存塊,因此它抓住了所有可能的內存,然後再分配更多內存,或者Windows可能不會讓它擁有那麼多內存。 (64位Windows 7)

(我並不需要這個東西,它只是一些好奇,我注意到)

+0

您是否將-Mmx設置爲適當的值(即.mx> ms)? – sw1nn 2012-03-15 23:09:54

+0

@ sw1nn - 是的,我將mx設置爲4096米。我不認爲如果ms> mx,虛擬機將啓動。 – marathon 2012-03-15 23:17:10

+0

你如何測量Java進程的內存使用情況? – prunge 2012-03-15 23:21:10

回答

2

默認的內存使用Windows任務管理器顯示你是不是在虛擬的進程分配內存空間。這個過程實際上寫入了虛擬空間中的多少,而虛擬空間必須映射到實際內存上。如果在任務管理器中啓用「Commit Size」列,將從流程的虛擬地址空間的角度顯示實際被視爲「使用」的內容。 (大致Xms + permsize +虛擬機和系統內容的大小本身。)

+0

我現在看到它了,謝謝,感動。 – marathon 2012-03-16 17:37:05

0

JVM需要連續的堆內存區域。這意味着它在啓動時將最大大小分配爲虛擬內存。這並不像聽起來那麼糟糕,因爲操作系統只是爲應用程序分配主內存(不是它分配虛擬內存時)(不是當它分配虛擬內存時)

如果查看像VisualVM這樣的工具中使用的內存量,你甚至可以發現,即使有150-500MB的開銷,它的尺寸也小於最小尺寸。這是因爲Java不使用最小大小,如果它沒有使用它。

取而代之的是,最小尺寸是指它僅在次要嘗試清理內存的點以下。 (您可能會看到它執行次要GC)在大多數情況下,這意味着應用程序將很快使用最小大小。但是,「hello world」程序不會使用最小尺寸。

也許Windows不是讓它有那麼多的內存來啓動與

的JVM將無法啓動,如果它不能分配的最大尺寸爲連續的塊。 (這是在32位窗口的通病,使得限制可能是1.5 GB或低至1.2 GB)