2018_01_10 java.lang.OutOfMemoryError: Java heap space內存溢出

引起java內存溢出的原因有很多:

主要有:

1、儘早釋放無用對象的引用。好的辦法是使用臨時變量的時候,讓引用變量在退出活動域後,自動設置爲null,暗示垃圾收集器來收集該對象,防止發生內存泄露。


對於仍然有指針指向的實例,jvm就不會回收該資源,因爲垃圾回收會將值爲null的對象作爲垃圾,提高GC回收機制效率;


2、我們的程序裏不可避免大量使用字符串處理,避免使用String,應大量使用StringBuffer,每一個String對象都得獨立佔用內存一塊區域;


String str = "aaa";


String str2 = "bbb";


String str3 = str + str2;//假如執行此次之後str ,str2以後再不被調用,那它就會被放在內存中等待Java的gc去回收,程序內過多的出現這樣的情況就會報上面的那個錯誤,建議在使用字符串時能使用StringBuffer就不要用String,這樣可以省不少開銷;


3、儘量少用靜態變量,因爲靜態變量是全局的,GC不會回收的;(這裏翻過車)


4、避免集中創建對象尤其是大對象,JVM會突然需要大量內存,這時必然會觸發GC優化系統內存環境;顯示的聲明數組空間,而且申請數量還極大。


這是一個案例想定供大家警戒


使用jspsmartUpload作文件上傳,運行過程中經常出現java.outofMemoryError的錯誤,


檢查之後發現問題:組件裏的代碼


m_totalBytes = m_request.getContentLength();


m_binArray = new byte[m_totalBytes];


問題原因是totalBytes這個變量得到的數極大,導致該數組分配了很多內存空間,而且該數組不能及時釋放。解決辦法只能換一種更合適的辦法,至少是不會引發outofMemoryError的方式解決。參考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747


5、儘量運用對象池技術以提高系統性能;生命週期長的對象擁有生命週期短的對象時容易引發內存泄漏,例如大集合對象擁有大數據量的業務對象的時候,可以考慮分塊進行處理,然後解決一塊釋放一塊的策略。


6、不要在經常調用的方法中創建對象,尤其是忌諱在循環中創建對象。可以適當的使用hashtable,vector 創建一組對象容器,然後從容器中去取那些對象,而不用每次new之後又丟棄


7、一般都是發生在開啓大型文件或跟數據庫一次拿了太多的數據,造成 Out Of Memory Error 的狀況,這時就大概要計算一下數據量的最大值是多少,並且設定所需最小及最大的內存空間值。

發佈了37 篇原創文章 · 獲贊 21 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章