2013-11-27 120 views
0

我打算使用Spring的ThreadLocalTargetSource來訪問我的Web應用程序和Web服務應用程序的用戶上下文。Spring ThreadLocalTargetSource - 這是否有內存泄漏?

我已經瀏覽了一段時間的網絡,我看到的所有內容都是關於內存泄漏的可怕結果。我看到ThreadLocalTargetSource實現已經有一個destroy方法清理並取消threadlocal對象。我相信這一切都很好。那麼爲什麼當Spring以正確的方式處理內存泄漏呢?我們需要爲此明確地做些什麼?

+0

你可以張貼一些鏈接到你所提到的可怕的結果? –

+0

謝謝鄧肯,下面這個提到了ThreadLocal的惡魔。由於spring的threadlocaltarget是建立在threadlocal之上的,我懷疑這是否會在我的項目中造成問題?最好安全,比晚... http://blog.igorminar.com/2009/03/identifying-threadlocal-memory-leaks-in.html – Faz

回答

0

這不是一個大傷害使用,但必須小心。

正如API文檔所建議的,每個線程都有它的目標副本,並且在應用程序實際關閉之前可能會有很少的線程綁定對象。

API聲明只是建議這個類必須特別小心使用,儘管字符串提供了destroy方法使對象可用於GC。否則,這是非常好的使用。

如果您想使用ThreadLocal,請爲每個請求週期取消設置對象。

請參考以下鏈接到博客和API文檔

http://tigrou.nl/2009/05/09/springs-threadlocaltargetsource/

http://docs.spring.io/spring/docs/2.0.x/api/org/springframework/aop/target/ThreadLocalTargetSource.html

+0

感謝Abhijith,你是什麼意思**使對象可用於GC **,SPRING在銷燬方法中正是這樣做的,不是嗎?請讓我知道,在這裏可能會誤解你。 – Faz

+0

這是我的代碼,(這是否很好,或者我們是否需要包含其他內容?) 'ThreadLocalTargetSource t =(ThreadLocalTargetSource)appCtx.getBean(「threadLocal」); \t \t \t ReqContext reqContext =(ReqContext)target.getTarget(); \t \t UserContext usrholder = reqContext.getUserContext(); usrholder.setAppId(「Tset」); ' – Faz

+0

我的意思是一樣的,Spring將線程池及其關聯的對象取消,並且通過GC清除無效的對象。 –