2013-03-08 72 views
1

我目前在Jetty中運行Grails應用程序。它工作正常,但是比我想要的記憶更多。Grails應用程序佔用的內存超過可能嗎?

htop表明碼頭正在運行,像這樣:java -server -Xmx256m -Xms256m -Xmn96m -XX:MaxPermSize=64m -Djetty.home=/home/...

在我看來,那麼,該碼頭可以利用可能的最大內存應該256 + 64 = 320 MB。相反,它看起來是這樣的:

 
    PID USER  PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 
6256 jetty  20 0 2747M 623M 13732 S 0.0 31.3 1:28.06 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java -server -Xmx256m -Xms256m -Xmn96m -XX:MaxPermSize=64m -Djetty.home=... 

很顯然,我不會期望的內存使用量是完全320 MB,但它不應該是接近?爲什麼它會是預期記憶的兩倍?如果有的話,當堆填滿時,Java不應該拒絕分配更多空間嗎?

我想看看exaftly發生了什麼事情與jmap,但一切看起來我的權利:

# jmap -heap 6256 
Attaching to process ID 6256, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 23.7-b01 

using thread-local object allocation. 
Parallel GC with 4 thread(s) 

Heap Configuration: 
    MinHeapFreeRatio = 40 
    MaxHeapFreeRatio = 70 
    MaxHeapSize  = 268435456 (256.0MB) 
    NewSize   = 100663296 (96.0MB) 
    MaxNewSize  = 100663296 (96.0MB) 
    OldSize   = 5439488 (5.1875MB) 
    NewRatio   = 2 
    SurvivorRatio = 8 
    PermSize   = 21757952 (20.75MB) 
    MaxPermSize  = 67108864 (64.0MB) 
    G1HeapRegionSize = 0 (0.0MB) 

Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 65208320 (62.1875MB) 
    used  = 33343488 (31.798828125MB) 
    free  = 31864832 (30.388671875MB) 
    51.13379396984924% used 
From Space: 
    capacity = 17170432 (16.375MB) 
    used  = 0 (0.0MB) 
    free  = 17170432 (16.375MB) 
    0.0% used 
To Space: 
    capacity = 18284544 (17.4375MB) 
    used  = 0 (0.0MB) 
    free  = 18284544 (17.4375MB) 
    0.0% used 
PS Old Generation 
    capacity = 167772160 (160.0MB) 
    used  = 132604224 (126.46124267578125MB) 
    free  = 35167936 (33.53875732421875MB) 
    79.03827667236328% used 
PS Perm Generation 
    capacity = 67108864 (64.0MB) 
    used  = 55899320 (53.30974578857422MB) 
    free  = 11209544 (10.690254211425781MB) 
    83.29647779464722% used 

26872 interned Strings occupying 2932096 bytes.

據我所知,無論是燙髮根空間也不是堆空間都滿了。那麼〜400MB內存被用於什麼?有什麼我可以在我的Grails應用程序或Jetty中改變以減少它?

我以前在Jetty上運行過Grails應用程序,內存使用率很低。剛剛選中了一個,它使用了220 MB的內存,所以我不確定我做錯了什麼。

回答

2

JVM是一個本地程序,其中包括本地內存,其中包括consumes native resources。本地內存是運行時進程可用的內存,與Java應用程序使用的Java堆內存不同。每個虛擬化資源(包括Java堆和Java線程)都必須存儲在本機內存中,以及虛擬機運行時使用的數據。
您也可以看看answer,它很好地解釋了這個問題。
這個thread顯示瞭如何使用Java來泄漏本機內存的一些很好的例子。
Jetty documentation也指這個主題。
如果您使用的是JDK7,則可以使用VisualVM buffer monitor plugin來監視在垃圾回收堆外部分配的直接緩衝區。

+1

它看起來像別的東西出錯了。我有另一臺運行Grails的服務器共有220 MB的內存(RES),但我無法得到這個運行相同應用程序的600 MB以下的內存。類似的Grails和Jetty版本,相同的操作系統,都是64位等。 – 2013-03-08 16:15:39

+1

兩個實例使用相同的數據集?類似的要求?相同的負載? – 2013-03-09 21:13:55

+1

剛剛測試過。完全相同的應用程序,完全沒有負載,根本沒有數據,此時只是空表。相同版本的Grails。 – 2013-03-10 02:36:17

相關問題