2008-12-05 25 views
18

我正在探索在具有非常大量內存的機器上運行Java應用程序的可能性(從300GB到15TB的任何位置,可能位於SGI Altix 4700機器上)我很好奇Java的GC如何在這種情況下執行。具有大量內存的Java性能

我聽說IBM或JRockit的JVM可能比Sun更適合這一點。有沒有人知道在這種情況下有關JVM性能的任何研究或數據?

回答

6

在Sun JVM,您可以使用選項-XX:UseConcMarkSweepGC打開併發標記和清除收集器,這將避免幾乎完全停止默認GC算法的「停止世界」階段,代價是稍微多一點的開銷。

在這樣的機器上使用超過虛擬機的建議是恕我直言過時。 在現實世界的應用程序中,您經常擁有足夠的共享數據,以便CMS和一個JVM的性能更好。

-8

當然,關於GC將如何執行的答案是「誰在乎?」 ;-)

+0

呃,好吧,例如,如果它在完成GC時沒有發出警告而導致機器凍結幾個小時就會出現問題。 – sanity 2008-12-05 14:14:12

+0

這個問題的作者似乎很關心。咄。 – Guge 2008-12-05 14:50:03

+1

我想威爾只是幽默地說「GC不太可能發生。」這對我運行的東西可能是正確的。對提問者沒有任何線索。 :) – skiphoppy 2008-12-05 14:54:00

4

問題是:你想在單個進程(JVM)內運行嗎?如果你這樣做,那麼你將有一個問題。請參閱Tuning Java Virtual MachinesOracle Coherence User Guide和類似文檔。我操作的經驗法則是儘量避免大於1GB的堆。而512MB-1GB的完整GC可能需要不到一秒的時間。 2-4GB的完整GC可能需要5秒或更長的時間。從表面上看,這取決於很多因素,但故事的寓意是GC開銷不能線性縮放,一旦進入一秒範圍性能,則會迅速降級。

2

這並非完全回答你的問題,但如果你打算部署一個龐大的Java應用程序,你可能有興趣查看Azul Systems appliances。他們說可以在應用程序中創建一個670 GB堆的情況下進行垃圾收集而不會造成暫停。

3

自5.0以來,熱點JVM使用一種稱爲人體工程學的概念來嘗試優化內存使用情況。這不僅僅基於大量的可用內存,還影響堆大小,生成大小和垃圾收集算法。

開始通過具有這樣的讀取,這也解釋了人體工程學和更多:所有這些

http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf

還有一個叫布賴恩戈茨傢伙寫過關於Java如何分配和使用內存的大量文章,並更可以在這裏找到:

http://www.briangoetz.com/pubs.html

0

的唯一的人誰真的可以告訴你是SGI。超級計算機的行爲不像只有更大的普通服務器。

但是,我發現Java在執行訪問它的處理器的本地內存時表現最佳。注意:GC需要能夠將整個存儲器端到端地移動。這意味着如果你的設計像很多計算機粘在一起,這可能就是這種情況,它不能很好地擴展。內存模塊大小爲32 GB,因此如果將JVM限制爲適合此大小,則可能會獲得更好的性能。

1

您可能需要考慮在此機器上運行虛擬Terracotta羣集。

0

這篇文章接受的答案是相當老,現在已過時。截至2014年9月,如果您使用的是Java 7,則應該切換到GC1收集器。從Java 7 Update 4版本註釋:

http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

「的G1收集器針對的是充分利用當今的多處理器服務器上的大量的可用內存,同時仍保持在控制之下的垃圾收集延遲應用應用需要大堆,擁有大量活動數據集,具有突發或非均勻工作負載或遭受長期垃圾收集誘發的延遲,應該從切換到G1中受益。「

相關問題