內存泄露,內存溢出

一:內存泄漏,內存溢出

內存泄露:是指無用對象(不再使用的對象)持續佔有內存或無用對象的內存得不到及時釋放,從而造成的內存空間的浪費稱爲內存泄露。內存泄露有時不嚴重且不易察覺,這樣開發者就不知道存在內存泄露,但有時也會很嚴重,會提示你Out of memory。

避免內存溢出
OOM即Out Of Memory,一般是由程序編寫者對內存使用不當,如對該釋放的內存資源沒有釋放,導致其一直不能被再次使用而使內存被耗盡的現象。根本的解決辦法是對代碼進行優化:在內存引用上做些處理,使用軟引用,虛引用和弱引用;在內存中加載圖片時直接在內存中做處理,如邊界壓縮等;建立動態回收內存機制;優化Dalvik虛擬機的堆內存分配,自定義堆內存大小等。

1.數據庫的cursor沒有關閉

2.構造adapter沒有使用緩存Converview

3.調用registerReceiver後未調用unregisterReceiver

4.未關閉InputStream/OutputStream

5.Bitmap使用未調用recycle

6.Context泄漏

7.static關鍵字等

Java代碼導致OutOfMemoryError錯誤的解決:

需要重點排查以下幾點:

檢查代碼中是否有死循環或遞歸調用。
檢查是否有大循環重複產生新對象實體。
檢查對數據庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引起內存溢出。因此對於數據庫查詢儘量採用分頁的方式查詢。
檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。

內存泄漏可以分爲4類:

1) 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。

2) 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。

3) 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。

事實上在Java的GC機制中如果一個對象有着具體的引用,那麼是不會被GC自動回收的。
也就是說:

Object obj = new Object();//寫在100個循環內等於你有100個引用對應了100個對象
所以100個對象在一段時間內都是會佔用內存,直到內存不足GC主動回收

obj = new Object();//寫在100個循環內等於你使用1個引用分別100次調用了100個對象
所以當後一個對象init後,前一個對象已經是“無引用狀態”,會很快的被GC自動回收
(在你的循環還未結束時,可能已經進行了多次GC回收,這點很重要)

也就是說第二種方法能更好的管理內存。

二:請求超時或者響應超時:

HTTP 503 錯誤 – 服務不可用 (Service unavailable)
因暫時超載或臨時維護,您的 Web 服務器目前無法處理 HTTP 請求。 其含義是, 這是一個暫時情況,會有一些延誤, 過 後將會得到緩解。 有些服務器在這種情況下也許乾脆拒絕套接字(socket) 連接,在這種情況下,可能會由於套接字建立超時而產生不同的錯誤信息。

ConnectException : 指的是服務器請求超時
SocketTimeoutException:指的是服務器響應超時

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章