深入理解Spring系列之十三:IntrospectorCleanupListener解析

Introspector作用及影響

在分析IntrospectorCleanupListener之前,先了解一下Introspector迹卢。Introspector是JDK中java.beans包下的類慎冤,它為目標JavaBean提供了一種了解原類方法默责、屬性和事件的標準方法弛说。通俗的說,就是可以通過Introspector構(gòu)建一個BeanInfo對象秕铛,而這個BeanInfo對象中包含了目標類中的屬性、方法和事件的描述信息缩挑,然后可以使用這個BeanInfo對象對目標對象進行相關(guān)操作但两。

下面看一個簡單的示例會很容易明白。為了簡單供置,Student類中只有一個name屬性谨湘。


結(jié)果輸出:Student{name='張三'}

通過查看Introspector.getBeanInfo方法的源碼會發(fā)現(xiàn),Introspector在構(gòu)建一個BeanInfo對象的時候芥丧,會將構(gòu)建的BeanInfo對象和原類緩存到一個Map中紧阔,源碼如下。

通過上的代碼可以得出续担,Introspector間接持有了BeanInfo的強引用擅耽。如果使用Introspector操作了很多類,那么Introspector將間接持有這些BeanInfo的強引用赤拒。在發(fā)生垃圾收集的時候秫筏,檢測到這些BeanInfo存在引用鏈,則這些類和對應的類加載器將不會被垃圾收集器回收挎挖,進而導致內(nèi)存泄漏这敬。所以,為了解決這個問題蕉朵,在使用Introspector操作完成后崔涂,調(diào)用Introspector類的flushCaches方法清除緩存。

通過上面的代碼會發(fā)現(xiàn)始衅,清除的時候是清空了整個緩存冷蚂,因為沒有很好的辦法來確定每個緩存是屬于哪個應用的缭保,所以清除的時候會清除所有應用的緩存。

IntrospectorCleanupListener解析

上面分析了Introspector的作用和影響蝙茶,那IntrospectorCleanupListener和Introspector有什么關(guān)系呢艺骂?
IntrospectorCleanupListener是spring-web jar中的類,源碼如下隆夯。

IntrospectorCleanupListener實現(xiàn)了ServletContextListener接口钳恕,也就是說,在web容器初始化(準確的說是在filters或servlets初始化之前)的時候會執(zhí)行contextInitialized方法蹄衷,在ServletContext銷毀(準確的說是在filters和servlets銷毀之后)的時候會執(zhí)行contextDestroyed方法忧额。從圖中contextDestroyed方法,可以看到在銷毀ServletContext的時候調(diào)用了Introspector.flushCaches方法愧口,清空了對應緩存睦番。IntrospectorCleanupListener中為什么要這么做?難道是Spring使用Introspector操作后沒有清空對應緩存耍属?查看IntrospectorCleanupListener類的源碼托嚣,會發(fā)現(xiàn)有這樣一段標注。

大意是說恬涧,在使用Spring本身的時候并不需要使用此監(jiān)聽器注益,因為Spring自己的內(nèi)部機制會立即清空對應的緩存。雖然溯捆,Spring本身不存在這樣的問題丑搔,但是如果和其它框架結(jié)合使用,而其它框架有這個問題提揍,如Struts啤月、Quartz等,那就需要配置這個監(jiān)聽器劳跃,在銷毀ServletContext的時候清空對應緩存谎仲。

有一點需要注意的是,像這樣一個簡單的Introspector內(nèi)存泄漏將會導致整個應用的類加載器不會被垃圾收集器回收刨仑,如果有內(nèi)存泄漏的問題郑诺,可以考慮此因素。

配置IntrospectorCleanupListener

在以往的工作經(jīng)歷中杉武,多次看到在web.xml中將IntrospectorCleanupListener配置成非第一個listener辙诞。

其實,看過源碼的都知道轻抱,官方的表述是必須將此監(jiān)聽器配置成web.xml中的第一個listener飞涂,才能在合適的時間發(fā)揮最有效的作用。

原因其實很簡單,在Servlet3.0規(guī)范之前较店,監(jiān)聽器的調(diào)用是隨機的士八,而從Servlet3.0開始,監(jiān)聽器的調(diào)用順序是根據(jù)其在web.xml中配置的順序梁呈,并且實現(xiàn)ServletContextListener的監(jiān)聽器婚度,contextInitialized方法調(diào)用順序是按照在web.xml中配置的順序正序依次執(zhí)行,而contextDestroyed方法的調(diào)用順序是按照在web.xml中配置的順序逆序依次執(zhí)行捧杉。所以陕见,如果IntrospectorCleanupListener被配置成了第一個listener秘血,那么它的contextDestroyed方法將最后一個執(zhí)行味抖,將發(fā)揮最有效的清除作用;而如果不是灰粮,那么可能會殘留未被清除的緩存仔涩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市粘舟,隨后出現(xiàn)的幾起案子熔脂,更是在濱河造成了極大的恐慌,老刑警劉巖柑肴,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霞揉,死亡現(xiàn)場離奇詭異,居然都是意外死亡晰骑,警方通過查閱死者的電腦和手機适秩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕舆,“玉大人秽荞,你說我怎么就攤上這事「Ч伲” “怎么了扬跋?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凌节。 經(jīng)常有香客問我钦听,道長,這世上最難降的妖魔是什么倍奢? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任朴上,我火速辦了婚禮,結(jié)果婚禮上娱挨,老公的妹妹穿的比我還像新娘余指。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布酵镜。 她就那樣靜靜地躺著碉碉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淮韭。 梳的紋絲不亂的頭發(fā)上垢粮,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音靠粪,去河邊找鬼蜡吧。 笑死,一個胖子當著我的面吹牛占键,可吹牛的內(nèi)容都是我干的昔善。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畔乙,長吁一口氣:“原來是場噩夢啊……” “哼君仆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牲距,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤返咱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牍鞠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖摹,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年难述,在試婚紗的時候發(fā)現(xiàn)自己被綠了萤晴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡龄广,死狀恐怖硫眯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情择同,我是刑警寧澤两入,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站敲才,受9級特大地震影響裹纳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜紧武,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一剃氧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阻星,春花似錦朋鞍、人聲如沸已添。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽更舞。三九已至,卻和暖如春坎吻,著一層夾襖步出監(jiān)牢的瞬間缆蝉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工瘦真, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刊头,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓诸尽,卻偏偏與公主長得像原杂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弦讽,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理污尉,服務發(fā)現(xiàn),斷路器往产,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,803評論 6 342
  • 從三月份找實習到現(xiàn)在,面了一些公司某宪,掛了不少仿村,但最終還是拿到小米、百度兴喂、阿里蔼囊、京東、新浪衣迷、CVTE畏鼓、樂視家的研發(fā)崗...
    時芥藍閱讀 42,239評論 11 349
  • 日月更替,四季輪回壶谒,眼看五月即將過去云矫,馬上就要進入啤酒的銷售旺季,回顧過去幾個月的工作過程中的經(jīng)驗教訓汗菜,期盼未來的...
    遺忘_c5b3閱讀 1,080評論 0 0
  • 其實让禀,一直以來我都用:“相見爭如不見,有情何似無情陨界⊙沧幔”來說服自己不去想你、不再沉迷在“虛擬”的世界中菌瘪。但無意間我看...
    最愛海綿寶寶閱讀 344評論 0 0