2013-05-13 60 views
0

我正在使用番石榴庫14.0.1來實現緩存服務(包含一個servlet來放置和獲取值的Web應用程序)。 Web應用程序部署在包含1GB RAM(谷歌後端)的機器上。寫入和讀取操作數量巨大(每秒50個查詢)。番石榴緩存內存泄漏

即使在達到maximumSize限制後,機器上使用的RAM數量也會不斷增加。我懷疑內存泄漏。

以下是我使用使用

Map result = cache.getAllPresent(keys); 

使用

cache.put(key, value); 

把緩存中的值創建緩存

Cache cache = CacheBuilder.newBuilder() 
       .expireAfterWrite(1, TimeUnit.DAYS) 
       .initialCapacity(2000000) 
       .maximumSize(3800000) 
       .concurrencyLevel(50) 
       .recordStats() 
       .build(); 

檢索值的代碼是有什麼設置,我可以用它來阻止超出限制的RAM使用量的增加。

+0

您是否在番石榴項目頁面打開了一張票? [https://code.google.com/p/guava-libraries/issues/list](https://code.google.com/p/guava-libraries/issues/list) – Chriss 2013-05-13 08:52:44

+0

剛剛創建了一個新問題。 – Rakesh 2013-05-13 09:09:42

回答

4

查詢率很低,所以我會盡量減少併發(可能是1-4)並減少最大大小。鑑於您的機器資源有限,我認爲最大尺寸爲1K到100K更合適,具體取決於您的對象的大小。

從Java文檔

公共CacheBuilder MAXIMUMSIZE(長尺寸) 指定高速緩存可以包含條目的最大數量。

如果你的條目是說1 KB,您將需要大約4 GB的僅此緩存。

我說速度是相當低的原因是,這個集合的通話通常應該採取微秒(即你的極限可能是每秒一百萬的訂單,爲1併發)

+0

大小不是問題。我正在儲存Long的。當我達到指定的最大大小時,內存消耗量爲950MB。但它並不止於此。它不斷增加。 – Rakesh 2013-05-13 10:29:26

+3

@Rakesh maximumSize並不是絕對的,因爲清理是分期付款的(從javadoc:「如果maximumSize或maximumWeight被請求的條目**可能**在每個緩存修改時被逐出」;重點是我的)。這就是爲什麼實際上可以擁有比指定的最大值更多的條目,並且爲什麼您不希望Peter提供的併發級別太高,因爲它會在「Cache」中創建儘可能多的段,最大大小必須有所不同強制執行。 50個請求/秒的併發級別是沒有必要的。 – 2013-05-13 10:58:53