簡體   English   中英

如何在Servlet中集成memcached? Tomcat和內存泄漏

[英]How to integrate memcached in a Servlet? Tomcat & memory leaks

在Google中搜索memcached java,第一個結果是將Memcached與Java結合使用

這個家伙(自稱為Internet上的隨機混蛋! )基於net.spy.memcached提出了一個Singleton。 它基本上通過創建20個MemcachedClient實例來創建20個線程和連接。 對於每個請求,它都會隨機選擇一個。

但是,這些線程和連接永遠不會關閉,並且每次在開發過程中熱交換應用程序時它們就會堆積(帶有Tomcat 7的警告)。

SEVERE: The web application [/MyAppName] appears to have started a thread named
[...] but has failed to stop it. This is very likely to create a memory leak.

通過查看MemcachedClient JavaDoc,我看到了一種稱為shutdown的方法,唯一的描述是“立即關閉”。 閉嘴 客戶端? 服務器? 我想是客戶端,因為它在MemcachedClient中,我想這個方法會關閉連接並終止線程。 編輯 :是的,它關閉了客戶端。

問題1在熱交換應用程序之前,如何在Tomcat 7中強制執行清除代碼?

問題2這種使用memcached(帶有清除代碼)的方法是否正確,還是更好地以其他方式重新開始?

我認為創建20個內存緩存客戶端是很愚蠢的-就像創建數據庫連接池的20個單獨副本一樣。 該客戶端的想法是它將多種請求與異步IO復用。 http://code.google.com/p/spymemcached/wiki/Optimizations

至於關閉它,只需調用:yourClient.shutdown()立即關閉,或例如yourClient.shutdown(3,TimeUnit.SECONDS),以留出一些時間進行更正常的關閉。

可以從Servlet的.destroy方法或整個WAR的上下文偵聽器中調用該方法。

我對memcached一無所知,但您可能可以編寫一個自定義上下文偵聽器,並在上下文偵聽器中放入某種關閉掛鈎,以便在上下文關閉時可以遍歷單例中的項目並將其關閉。

原來,這是Java AWS開發工具包的錯誤,與memcached無關。 Java AWS SDK 1.2.2版已修復此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM