2013-05-01 159 views
0

這適用於所有Java堆/ GC專家。 簡單而直接的問題:對Java堆大小設置的最大值有沒有硬性限制?Java堆大小硬限制

我正在使用的服務器之一是託管內存中的實時通信系統,並且使用服務器的客戶端要求我將內存量增加到192Gb(這不是錯字:192千兆字節!)。從技術上講,這是可能的,因爲機器是虛擬的。

除了上面的一個,我的另一個問題是:

  • 是JVM會如何處理這樣的規模?
  • 是否有任何showstopper設置它?
  • 有什麼我應該知道的,當處理這種尺寸?

在此先感謝任何願意幫助的人。

問候。

+0

如果你有一個測試系統,並且需要一個程序來抓取堆大小,我可以幫你。會有興趣知道結果。 – tgkprog 2013-05-01 16:17:53

+0

謝謝。 「抓堆大小」是什麼意思? – Diferdin 2013-05-01 16:19:09

+0

我不確定是否可以提供幫助,但無論如何,允許其他人貢獻,您使用哪種操作系統和哪種JVM? – wmorrison365 2013-05-01 16:21:38

回答

1

1)讓他們考慮讓虛擬機將內存和內存之間的內存交換到磁盤,並使用它們的代碼執行操作。有時它可以讓虛擬機做到這一點,但沒有額外的工作。有時,他們知道有關數據特徵的某些內容並且他們的優化是以這種方式爲目標時,速度會更快。 2)考慮可能使用多個JVM,這些JVM或者以某種方式與並行運行的操作範圍並行或運行。有時甚至在同一個虛擬機上運行4個運行相同應用程序的JVM,每個JVM使用1/4的內存可能會更好。 (取決於您的應用程序的特性。)

3)考慮像TerraCotta的大內存這樣的內存管理框架。這個領域有競爭對手。例如,VMWare具有彈性內存。他們使用JVM堆外的內存來存儲內容並避免GC問題。或者他們分配非常大的堆對象並獨立於Java進行管理。

4)如果內存被活動對象佔用,並且它們最終轉移到老一代進行垃圾回收,JVM就會確定(TM)。 GC可能是一個問題。這是一種黑色藝術。在嘗試優化GC之前,務必殺死一隻雞並在虛擬機上散佈羽毛。 :)哦...並且這裏有一些非常有趣的評論:Java very large heap sizes

5)有時你設置的JVM的大小和其他因素超出了你的控制範圍,使它不能增長那麼大。一定要做一些測試,以確保它真的能夠增長到您設置的大小。

而5號是真正的重點項目。測試。測試。並測試更多。你處於探索領域的邊緣。

1

JVM spec for java 7並不表示存在硬限制。

我建議,它是由您的操作系統和可用內存量。 但是,您必須意識到JVM需要足夠的內存用於其他內部結構(如規範描述),例如PermGen,常量池等。我還建議您在任意增加堆大小之前考慮分析。您的老字號空間可能會佔用內存。我會使用VisualGC(現在在VisualVM)來觀察內存使用情況,並使用YourKit來查找泄漏情況(其世代能力是真正的幫助)。

我還沒有回答你的其他問題,但可能不能說比你的其他受訪者更多。