2012-02-27 168 views
0

我正在構建一些應用程序,我必須使用memcached。Memcached內存泄漏

我發現相當不錯的客戶端:

net.spy.memcached.MemcachedClient

在此cliend一切工作馬麗娟,除了一個 - 我有密切聯繫的問題,並在一段時間後,我很startign到與內存泄漏斗爭。

我一直在尋找關閉連接的可能性,並且我「關閉」了方法。但是,如果我用這個方法是這樣的:

MemcachedClient c = new MemcachedClient(new InetSocketAddress(
         memcachedIp, memcachedPort)); 
c.set(something, sessionLifeTime, memcache.toJSONString()); 
c.shutdown(); 

我有添加任何做memcached的問題 - 在日誌中我看到,這個方法打開連接,在此之前它會添加任何memcached的,它closeing連接。

你有什麼想法,該怎麼辦?

此外 - 我發現方法:c.shutdown(2, TimeUnit.SECONDS); - 應該在2秒後關閉連接,但我已連接jmx顯示器到我的tomcat,我看到,Memcached thread未完成2秒後 - 此線程尚未完成所有...

+0

我對此客戶沒有太多經驗,但是您是否看過[此頁上的Google](http://code.google.com/p/spymemcached/wiki/Examples)。在一些例子中,似乎有一些'try/catch'塊。你有沒有試過(如果可能的話)? – Rob 2012-02-27 13:30:27

+0

抱歉 - 這不是關於try/catch – Ilkar 2012-02-27 13:52:19

回答

1

你有一個問題,像這樣向memcached添加東西的原因是set(...)函數是異步的,它所做的只是將該操作放入要發送到memcached的隊列中。由於您在此之後立即致電關機,因此該操作實際上沒有時間將其導出到電線上。您需要調用set(...)。get()以使您的應用程序線程在調用shutdown之前實際等待操作完成。

此外,我還沒有經歷過IO線程在調用超時後關閉不死。您可以確認這是一個實際的錯誤的一種方法是通過Spymemached運行獨立程序。如果該過程在完成時沒有終止,那麼您發現了一個問題。