2012-01-20 40 views
6

有多少數據對ehcache之類的堆緩存過多?堆上java高速緩存有多少數據太多?我應該什麼時候開始考慮堆外緩存?

我得到一個24GB的RAM服務器。我可能會開始致力於緩存2-4 GB,但最終可能會投入20GB左右的緩存。在什麼時候我應該擔心堆緩存GC會花費太長時間?

順便說一下,DirectMemory是唯一可用的開源堆外緩存嗎?黃金時間準備好了嗎?

+0

您的問題的答案更多地取決於緩存使用特徵比緩存大小。例如,讀/寫比率,TTL,要存儲的對象的大小,可以存儲的對象的數量。另外,你的問題是問一個相當模糊的問題。你會認爲「太久了?」或「準備好黃金時間?」在真正評估任何緩存解決方案之前,您必須知道您需要什麼樣的SLA。最大響應時間(以毫秒爲單位)以及SLA命中百分比。 – allingeek

回答

3

取決於您的JVM,尤其是使用的GC。特別是舊的GCs並不能真正處理真正的大堆,但是解決這個問題的努力越來越多。

Azul系統例如銷售具有數百GB堆的硬件而沒有問題(即gc在半分鐘內暫停),這歸功於它們的special GC,因此它不是Java本身的限制。不知道熱點/ IBM隨着時間的推移有多好。但是24GB的堆不會那麼大 - 無論如何,G1應該可以在那裏做足夠好的工作。

2

在什麼時候我應該擔心堆緩存的GC需要很長時間?

多久太久了?

說真的,如果你正在運行一個「吞吐量」垃圾回收器,並且這會給你太多的暫停,那麼你應該嘗試切換到一個低暫停收集器;例如CMS或G1。

2

大型緩存的主要問題是完整的GC時間。給你一個想法,它可能是每秒1秒(這在應用程序中有所不同)如果你有一個20 GB的緩存,並且你的應用程序暫停20秒,那麼每隔一段時間就可以接受?

作爲直接映射文件和內存映射文件的粉絲,我傾向於考慮何時不將數據從堆中取出,而只是爲了簡化而使用堆。 ;)無論大小如何,內存映射文件幾乎不影響完整的GC時間。

使用內存映射文件的優點之一是它可能比您的物理內存大得多,並且仍然表現良好。這使操作系統確定哪些部分應該在內存中以及需要刷新到磁盤上。

BTW:擁有更快的SSD也有幫助;)更大的驅動器也往往更快。檢查他們可以執行的IOP。

在此示例中,我創建了映射到具有16 GB的計算機上的8 TB文件內存。 http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

請注意,它在80 GB文件示例中執行得更好,8 TB可能會被殺死。 ;)

相關問題