Java內存洩漏常見代碼

Java內存洩漏的根本原因是:長生命週期的對象持有短生命週期對象的引用

① 靜態集合類引起內存洩漏

像hashmap,vector等靜態變量生命週期和應用程序一致,他們所引用的所有對象obj也不能被釋放,因為一致被引用著。最簡單的辦法就是vector=null

② 監聽器

往往釋放對象時候,忘記刪除監聽器

③ 各種連接

比如數據庫連接、網絡連接、IO連接,除非顯式調用close()否則不會被gc回收。對於resultSet和statement對象可以不顯式回收,但是connection一定要顯式回收,因為connection在任何時候都不會自動回收,而一旦connection回收,resultSet和statement對象也會被置為null。如果使用連接池,處了要顯式關閉connection,還要顯式關閉resultSet Statement對象(關閉其中一個,另一個也會自動關閉),否則就會造成大量statement對象無法釋放,一般在finally釋放連接

④ 內部類和外部模塊的引用

程序A調用B內部類的方法,傳一個對象進去,很可能B就保持了這個對象的引用

⑤ 單例模式

單例對象在初始化後將在JVM整個生命週期中存在(靜態變量的形式)如果單例對象持有外部對象的引用,那麼這個對象也不能被回收。


Java內存洩漏常見代碼


分享到:


相關文章: