2016-02-12 40 views
2

是否有任何初始量的內存需要設置才能運行Spring Boot應用程序?運行Spring Boot應用程序的初始內存量

例如,要運行嵌入式Tomcat/Undertow應用程序,我們可以爲-Xms和-Xmx java選項設置典型的內存量。

如何找出我需要設置哪些值來運行我的應用程序?

回答

9

您應該運行JavaMissionControl或其他Profiler來查看您的實際內存要求。您可以通過從命令提示符運行「jmc」,然後附加到本地JVM,在安裝了Java的服務器上(以及路徑中)運行JavaMissionControl。您也可以附加到遠程JVM。欲瞭解更多信息,請參閱此鏈接:http://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.html

通常,我所做的是將最大內存設置爲高於所需的最大內存,max = 1GB似乎是一個很好的起點。您需要在一段典型的活動期間觀看應用程序的內存配置文件。意識到當你設置初始堆大小爲64mb時,垃圾收集器正在運行一個方案,該方案不會啓動一個主要的垃圾收集,直到出於性能原因(垃圾收集非常昂貴)。因此,隨着時間的推移,你會看到內存逐漸增加到堆大小的80%左右(這個百分比是可調的)。一旦達到閾值,垃圾回收就會啓動,您將看到使用的JVM內存再次下降很低。

正常情況下,我正在尋找的是在一系列主要垃圾收集之後持續使用的內存級別。因此,讓我們假設在運行應用程序後,您會發現主要垃圾收集之後的固態內存使用量一直下降到40Mb左右。因此,我通常會將最小JVM大小設置爲大約這個數量,因爲我知道我總是至少需要這麼多。

現在你知道一個體面的起點爲你的最低要求,那麼最大的內存需要什麼?那麼,這需要更多的分析和試驗和錯誤。我所做的是開始減少一段時間內最低的內存設置和配置文件。您正在尋找的是主要垃圾收集的頻率以及JVM CPU利用率達到一致的高值。

我會不斷減少內存,直到我看到主要垃圾收集在短時間內在負載下發生多次並且CPU在這些垃圾收集期間迅速增加。一旦我看到這種行爲,我會慢慢增加最大內存,直到停止行爲,找到所需最大內存的最佳位置。

這是一種非常簡單的方法,可以找到最小/最大內存設置的合理值,並且在大多數常見應用場景中對我非常適用。當然,如果您真的想調整您的需求,還有許多其他更詳盡的方式來分析您的應用程序以微調內存設置和垃圾收集方案/設置。

+0

如果我沒有設置任何-Xms和Xmx,則應用程序將使用InitialHeapSize:= 67108864(64Mb)和MaxHeapSize:= 1073741824(1GB)獲取Java Solaris的默認堆。通過命令「prstat -a」顯示幾乎全部使用它的應用程序(774Mb)。同樣,如果我設置-Xms128m -Xmx128m,應用程序也可以正常運行,所以這是我的問題,如何爲它找到適量的內存?原因沒有設置任何Java運行使用遠遠多於需要 –

+0

我相信這就是我在我的答案中描述...如何確定Xms和Xmx的正確值。 – pczeus

+0

但是,如果沒有設置Xmx,Java是否有任何理由使用幾乎所有可用的maxheap(1GB),並且同時如果設置128Mb,應用程序也可以正常工作? –

1

您需要的最大內存量取決於您的應用程序和它需要處理的負載。使用類似JMeter的工具來模擬一些負載是查看需要多少內存的一種方法。

內存的最小數量還取決於您的應用程序,但您至少需要25MB或更大的內存。 This blog post提供了大量附加信息。

+0

如果我沒有設置任何-Xms和Xmx,應用程序將以InitialHeapSize:= 67108864(64Mb)和MaxHeapSize:= 1073741824(1GB)獲取Java Solaris的默認堆。通過命令「prstat -a」顯示幾乎全部使用它的應用程序(774Mb)。同樣,如果我設置-Xms128m -Xmx128m,應用程序也可以正常運行,所以這是我的問題,如何爲它找到適量的內存?原因沒有設置任何Java運行使用遠遠超過需要。 –

0

通常我沒有任何標誌的啓動jar,並開始通過'Java VisualVM'進行監視。根據我設定的實際數據-Xmx。像那樣。

相關問題