如何避免記憶體洩漏、溢位的幾種常用方法
阿新 • • 發佈:2019-02-19
儘早釋放無用物件的引用。
好的辦法是使用臨時變數的時候,讓引用變數在退出活動域後自動設定為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;