2015-04-23 49 views
6

我們的JVM消耗的內存比預期的要多。我們做了一些分析,發現沒有泄漏。已使用的堆內存最高可達2.9 GB,但在空閒時間可降至800 MB。但承諾堆增加到3.5 GB(有時4 GB),永遠不會下降。在空閒時間之後,當使用的堆從800 MB增加時,則提交的堆內存將從3.5 GB增加。所以我們的服務器很快達到最大內存大小,我們必須每隔一天重新啓動一次。如何減少JVM中已提交的堆內存

我的問題是

  1. 我的理解是,提交的堆內存目前分配的內存。當使用堆內存減少爲什麼承諾的內存不會減少?
  2. 當從它的級別(800 MB)提交的堆內存也使用的堆內存的增加也會從它的級別(從3.5GB)

增加我們有以下內存設置在我們的服務器:

-Xmx4096M -Xms1536M -XX:PermSize=128M -XX:MaxPermSize=512M 
+2

承諾方式由jvm分配;你的最大堆大小是4gig,所以當需要的時候,承諾的內存會達到這個值。然後它可以被回饋給系統,但在你的情況下,jvm可能不需要這樣做。 –

+3

https://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryUsage.html –

+0

我只給JVM提供的可用內存量,例如,也許3 GB,然後你不需要重新啓動它。 –

回答

1

您可以嘗試調整-XX:MaxHeapFreeRatio,即「避免GC縮小後的最大堆空閒百分比」。默認值= 70

+0

我已經添加了這個,但GC大小後堆大小不會縮小。爲了測試目的,我給了XX:MaxHeapFreeRatio作爲10,但實際可用空間不止於此。我讀過的一些論壇說,JVM在獲得內存後永遠不會釋放內存。這是真的還是我需要添加任何其他參數來控制它。 –

+0

現在,當我添加-XX:+ UseSerialGC時,它的工作是否正確,如果我給出該選項,是否需要面對其他任何問題? –

+0

它可能對GC性能產生負面影響 –