1. 程式人生 > >如何避免記憶體洩漏、溢位的幾種常用方法

如何避免記憶體洩漏、溢位的幾種常用方法

儘早釋放無用物件的引用。

好的辦法是使用臨時變數的時候,讓引用變數在退出活動域後自動設定為null,暗示垃圾收集器來收集該物件,防止發生記憶體洩露。

程式進行字串處理時,儘量避免使用String,而應使用StringBuffer。

因為每一個String物件都會獨立佔用記憶體一塊區域,如:

String str = "aaa";    

String str2 = "bbb";    

String str3 = str + str2;    

// 假如執行此次之後str , str2再不被呼叫,那麼它們就會在記憶體中等待GC回收;    

// 假如程式中存在過多的類似情況就會出現記憶體錯誤;  

儘量少用靜態變數。

因為靜態變數是全域性的,GC不會回收。

避免集中建立物件尤其是大物件,如果可以的話儘量使用流操作。

JVM會突然需要大量記憶體,這時會觸發GC優化系統記憶體環境; 一個案例如下:

// 使用jspsmartUpload作檔案上傳,執行過程中經常出現java.outofMemoryError的錯誤,    

// 檢查之後發現問題:元件裡的程式碼    

m_totalBytes = m_request.getContentLength();    

m_binArray = new byte[m_totalBytes];    

totalBytes這個變數得到的數極大,導致該陣列分配了很多記憶體空間,而且該陣列不能及時釋放。    

// 解決辦法只能換一種更合適的辦法,至少是不會引發outofMemoryError的方式解決。    

儘量運用物件池技術以提高系統性能。

生命週期長的物件擁有生命週期短的物件時容易引發記憶體洩漏,例如大集合物件擁有大資料量的業務物件的時候,可以考慮分塊進行處理,然後解決一塊釋放一塊的策略。

不要在經常呼叫的方法中建立物件,尤其是忌諱在迴圈中建立物件。

可以適當的使用hashtable,vector 建立一組物件容器,然後從容器中去取那些物件,而不用每次new之後又丟棄。

優化配置。

  • 設定-Xms、-Xmx相等;
  • 設定NewSize、MaxNewSize相等;
  • 設定Heap size, PermGen space;