[英]Spring web application memory profiling doubts
我有帶有top命令的Spring應用程序,該命令在Amazon EC2小型實例(1.7 GB RAM)上顯示以下數據-
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
我將這個內存占用量與jenkins總共需要277 MB進行了比較,但是我的測試應用程序顯然占用了+400 MB,而沒有運行任何東西。
此時,代碼只有實體和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節目中最大的頂級Dominator類加載器報告-
org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf00f8bb0 - 45 MB - 56.91%
僅憑庫就很難估算,因為它取決於您的jvm設置,如何處理應用程序,與引導程序相關的代碼是否有效地使用了內存等? 對於具有這些依賴性的應用程序,400mb聽起來很正常。
堆占用率只是代碼和庫使用的內存部分。 jvm也需要內存才能運行。 另外,您的操作系統在分配內存時可能會有其自身的復雜性。
您可以嘗試調整各種jvm堆內存設置(請參見http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html )。 一些非常常見的設置是-Xmx -Xms -XX:MaxPermSize。
我的建議是使用一些jvm分析工具,該工具會為您提供堆使用情況圖表(例如:visualvm),確保堆消耗不會增加(查找鋸齒狀圖形),然后您可以確定需要多少並進行調整VM參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.