1. 程式人生 > >IntrospectorCleanupListener記憶體洩漏與內省-反射

IntrospectorCleanupListener記憶體洩漏與內省-反射

一、IntrospectorCleanupListener

spring中提供了一個名為org.springframework.web.util.IntrospectorCleanupListener的監聽器。它主要負責處理由JavaBeans Introspector的使用而引起的緩衝洩露

<!-- 防止記憶體洩露 -->   
<listener>   
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>   
</listener>

org.springframework.web.util.IntrospectorCleanupListener的監聽器。它主要負責處理由JavaBeans Introspector的使用而引起的緩衝洩露。

spring中對它的描述如下:  它是一個在web應用關閉的時候,清除JavaBeans Introspector的監聽器. 在web.xml中註冊這個listener. 可以保證在web 應用關閉的時候釋放與掉這個web 應用相關的class loader 和由它管理的類.  如果你使用了JavaBeans Introspector來分析應用中的類, Introspector 緩衝中會保留這些類的引用.結果在你的應用關閉的時候, 這些類以及web 應用相關的class loader沒有被垃圾回收.  不幸的是,清除Introspector的唯一方式是重新整理整個緩衝.這是因為我們沒法判斷哪些是屬於你的應用的引用. 所以刪除被緩衝的introspection會導致把這臺電腦上的所有應用的introspection都刪掉.  需要注意的是,spring 託管的bean不需要使用這個監聽器. 因為spring它自己的introspection所使用的緩衝在分析完一個類之後會被馬上從javaBeans Introspector緩衝中清除掉.  應用程式中的類從來不直接使用JavaBeans Introspector. 所以他們一般不會導致記憶體資源洩露. 但是一些類庫和框架往往會產生這個問題.例如:Struts 和Quartz.  單個的記憶體資源洩漏會導致整個的web應用的類載入器不能進行垃圾回收. 在web應用關閉之後,你會看到此應用的所有靜態類資源(例如單例).

這個錯誤當然不是由這個類自身引起的.

二、內省-反射

內省的定義:在電腦科學中,內省是指計算機程式在執行時(Run time)檢查物件(Object)型別的一種能力,通常也可以稱作執行時型別檢查。  不應該將內省和反射混淆。相對於內省,反射更進一步,是指計算機程式在執行時(Run time)可以訪問、檢測和修改它本身狀態或行為的一種能力。

內省(Introspector) 是Java 語言對 JavaBean 類屬性、事件的一種預設處理方法。

 通過反射的方式操作JavaBean的屬性,jdk提供了PropertyDescription類來操作訪問JavaBean的屬性,Beantils工具基於此來實現。

那麼反射和內省的區別是啥:

反射是在執行狀態把Java類中的各種成分對映成相應的Java類,可以動態的獲取所有的屬性以及動態呼叫任意一個方法,強調的是執行狀態。  內省機制是通過反射來實現的,BeanInfo用來暴露一個bean的屬性、方法和事件,以後我們就可以操縱該JavaBean的屬性

反射可以操作各種不同的java類,那麼內省只是通過反射來操作JavaBean的