幾種典型的Java內存泄漏
我們知道了在Java中確實會存在內存泄漏,那么就讓我們看一看幾種典型的泄漏,并找出他們發生的原因和解決方法。
全局集合
在大型應用程序中存在各種各樣的全局數據倉庫是很普遍的,比如一個JNDI-tree或者一個session table。在這些情況下,必須注意管理儲存庫的大小。必須有某種機制從儲存庫中移除不再需要的數據。
通常有很多不同的解決形式,其中最常用的是一種周期運行的清除作業。這個作業會驗證倉庫中的數據然后清除一切不需要的數據。
另一種管理儲存庫的方法是使用反向鏈接(referrer)計數。然后集合負責統計集合中每個入口的反向鏈接的數目。這要求反向鏈接告訴集合何時會退出入口。當反向鏈接數目為零時,該元素就可以從集合中移除了。
緩存
緩存一種用來快速查找已經執行過的操作結果的數據結構。因此,如果一個操作執行需要比較多的資源并會多次被使用,通常做法是把常用的輸入數據的操作結果進行緩存,以便在下次調用該操作時使用緩存的數據。緩存通常都是以動態方式實現的,如果緩存設置不正確而大量使用緩存的話則會出現內存溢出的后果,因此需要將所使用的內存容量與檢索數據的速度加以平衡。
常用的解決途徑是使用java.lang.ref.SoftReference類堅持將對象放入緩存。這個方法可以保證當虛擬機用完內存或者需要更多堆的時候,可以釋放這些對象的引用。
類裝載器
Java類裝載器的使用為內存泄漏提供了許多可乘之機。一般來說類裝載器都具有復雜結構,因為類裝載器不僅僅是只與"常規"對象引用有關,同時也和對象內部的引用有關。比如數據變量,方法和各種類。這意味著只要存在對數據變量,方法,各種類和對象的類裝載器,那么類裝載器將駐留在JVM中。既然類裝載器可以同很多的類關聯,同時也可以和靜態數據變量關聯,那么相當多的內存就可能發生泄漏。
【編輯推薦】