2014-10-20 59 views
0

我有Spring應用與頂部命令表示接着在Amazon EC2上的小實例(1.7 GB RAM)的數據 -Spring的web應用程序內存分析懷疑

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND         
5019 ubuntu 20 0 1971m 446m 17m S 4.7 27.0 31:25.61 java  

這是採取446 MB的內存僅用於引導軟件我有大約350個類,並且有Maven作爲依賴關係引入了庫。

free -m 

      total  used  free  shared buffers  cached 
Mem:   1656  1642   14   0   34  519 
-/+ buffers/cache:  1088  568 
Swap:   895   12  883 

Maven的Spring的依賴在那裏 -

Spring Core, Spring MVC, Spring Data , Spring Data Rest, , Spring 
Security, Spring HATEOAS, Spring Boot, Spring Oauth , Spring-Vaadin 

我這個內存佔用比較詹金斯是採取277 MB總,但我的測試應用程序顯然需要+400 MB沒有顯著運行任何東西。

此時代碼只有Entities和Spring Data Rest。 我做了一個堆轉儲分析,這表明休眠了15 MB的PID從應用程序頂級消費(使用JMAP拍攝)

Used heap dump 76.9 MB 
Number of objects 1,785,039 
Number of classes 12,546 
Number of class loaders 245 
Number of GC roots 2,589 
Format hprof 

在MAT節目最大的頂級霸主類加載器的報告 -

org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf00f8bb0 - 45 MB - 56.91% 
  1. 請問一般Spring Web應用程序採取+400 MB只是 以上時庫添加爲依賴啓動和使用命令mvn碼頭運行 :運行?
  2. 這裏堆佔用由JMAP雖然top命令顯示爲77 MB顯示+400 MB,爲什麼他們不匹配,因爲它們都是相同的PID 5019

回答

2
  1. 很難估計基於在圖書館裏,因爲它取決於你的jvm設置,你對你的應用程序做了什麼,你的引導相關代碼是否有效地使用了內存等?對於具有這些依賴性的應用程序,400mb聽起來很正常。

  2. 堆佔用率只是您的代碼和庫所使用的內存部分。 jvm也需要記憶才能運行。另外你的操作系統在分配內存時可能有其自己的複雜性。

您可以嘗試調整各種jvm堆內存設置(請參閱http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html)。一些相當常見的設置是-Xmx -Xms -XX:MaxPermSize。

我的建議是使用一些jvm分析工具,爲您提供一個堆使用圖(例如:visualvm),確保堆消耗不會爬起來(尋找鋸齒圖案),然後您可以評估多少您需要並調整VM參數。