2014-03-07 57 views
3

我正在研究Web服務和創建線程本地實例,並且只希望在應用程序關閉期間刪除它們(一旦爲線程創建threadlocal對象,我希望在不同服務期間使用該對象調用該線程)。由於線程是由tomcat創建和擁有的,有什麼辦法在應用程序關閉期間刪除這些threadlocals?在應用程序關閉時刪除tomcat線程上的threadLocal對象

+0

添加一個關閉掛鉤線程和釋放線程本地,它只在應用程序關閉時運行。 'Runtime.getRuntime()#addShutdownHook()' –

+0

[關閉鉤子for java web應用程序]的可能的重複(http://stackoverflow.com/questions/1549924/shutdown-hook-for-java-web-application) –

+0

可能重複的[如何清理threadlocals](http://stackoverflow.com/q/3869026/17300) –

回答

1

Tomcat的6有內存泄漏檢測到位,和Tomcat 7的實際排除邏輯 - 它會自動刪除所有的線程本地對象爲您提供:http://wiki.apache.org/tomcat/MemoryLeakProtection

理想情況下,你應該從線程本地刪除所有對象請求完成後, ,因爲同一個線程將被放回到線程池並用於處理其他請求 - 在這種情況下,線程本地值可能會干擾後續的請求邏輯,並且會導致所有類型的安全問題。

但是,如果你專門找保持線程值的局部爲Tomcat Web應用程序生命週期的整個過程 - Tomcat的7將清除它適合你的Web應用程序停機的照顧,認爲它是垃圾收集。

+0

我使用tomcat8,我仍然得到它 – Dejell

+0

你仍然得到_what_?如果您收到有關檢測到內存泄露和已刪除舊文件的通知,那麼預計會出現 –

+0

我在tomcat8中收到有關內存泄漏的錯誤。我認爲它正在照顧它。當我運行shutdown.sh時,它不關閉tomcat我需要終止進程。它有關係嗎? – Dejell

相關問題