2012-02-27 167 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运行独立程序。如果该过程在完成时没有终止,那么您发现了一个问题。