JAVA內存泄漏問題及解決辦法[轉]

Java的一個重要優點就是通過垃圾收集器(Garbage Collection,GC)自動管理內存的回收,程序員不需要通過調用函數來釋放內存。因此,很多程序員認爲Java不存在內存泄漏問題,或者認爲即使有內存泄漏也不是程序的責任,而是GC或 JVM的問題。其實,這種想法是不正確的,因爲Java也存在內存泄露,但它的表現與C++不同。

在Java中,內存泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,首先,這些對象是可達的,即在有向圖中,存在通路可以與其相連; 其次,這些對象是無用的,即程序以後不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定爲Java中的內存泄漏,這些對象不會被GC所回收,然而它卻佔用內存。

在C++中,內存泄漏的範圍更大一些。有些對象被分配了內存空間,然後卻不可達,由於C++中沒有GC,這些內存將永遠收不回來。在Java中,這些不可達的對象都由GC負責回收,因此不需要考慮這部分的內存泄露。

注意事項:

1.最基本的建議是儘早釋放無用對象的引用。如:



A a = new A(); //應用a對象

a = null; //當使用對象a之後主動將其設置爲空

….

注:如果a 是方法的返回值,不要做這樣的處理,否則你從該方法中得到的返回值永遠爲空,而且這種錯誤不易被發現、排除

2.儘量少用finalize函數。它會加大GC的工作量。

3.如果需要使用經常用到的圖片,可以使用soft應用類型。它儘可能把圖片保存在內存中

4.注意集合數據類型,包括數組、樹、圖、鏈表等數據結構,這些數據結構對GC來說,回收更爲複雜。

5.儘量避免在類的默認構造器中創建、初始化大量的對象,防止在調用其自類的構造器時造成不必要的內存資源浪費

6.儘量避免強制系統做垃圾內存的回收,增長系統做垃圾回收的最終時間

7.儘量避免顯式申請數組空間

8.儘量做遠程方法調用類應用開發時使用瞬間值變量,除非遠程調用端需要獲取該瞬間值變量的值。

9.儘量在合適的場景下使用對象池技術以提高系統性能。

- 商業智能 - 博客大巴
原文鏈接:http://annesun.blogbus.com/logs/33694166.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章