1. 程式人生 > >記憶體洩露,記憶體溢位

記憶體洩露,記憶體溢位

一:記憶體洩漏,記憶體溢位

記憶體洩露:是指無用物件(不再使用的物件)持續佔有記憶體或無用物件的記憶體得不到及時釋放,從而造成的記憶體空間的浪費稱為記憶體洩露。記憶體洩露有時不嚴重且不易察覺,這樣開發者就不知道存在記憶體洩露,但有時也會很嚴重,會提示你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:指的是伺服器響應超時

相關推薦

記憶體洩露記憶體溢位

一:記憶體洩漏,記憶體溢位 記憶體洩露:是指無用物件(不再使用的物件)持續佔有記憶體或無用物件的記憶體得不到及時釋放,從而造成的記憶體空間的浪費稱為記憶體洩露。記憶體洩露有時不嚴重且不易察覺,這樣開發者就不知道存在記憶體洩露,但有時也會很嚴重,會提示你Out

記憶體溢位記憶體洩露記憶體越界溢位

記憶體溢位:使用者要求系統分配的記憶體空間超出了系統所能提供的範圍,稱記憶體溢位 記憶體洩露:使用者向系統申請記憶體(new),使用完後沒有釋放的情況(delete),導致了該塊記憶體不能再被使用者使用,也不能被系統呼叫。我們常說的記憶體洩露指的是堆洩露 記憶體越界:使用已

記憶體洩露記憶體溢位和堆外記憶體JVM優化引數配置引數

記憶體洩漏 記憶體洩漏是指程式在申請記憶體後,無法釋放已申請的記憶體空間,無用物件(不再使用的物件)持續佔有記憶體或無用物件的記憶體得不到及時釋放,從而造成記憶體空間的浪費。記憶體洩漏最終會導致OOM。 造成記憶體洩漏典型場景: 1. 單例模式的不正確使用單例物件在初始化後將在JVM的整個生命週期中以靜態變數

記憶體洩露記憶體溢位的區別 (概念區別 產生原因區別 及解決辦法) 個人整理

記憶體洩露和記憶體溢位的區別 概念區別 記憶體溢位 : out of memory 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out fo memory 比如申請一個integer 但給它存了long才能存下的數那就是記憶體溢位 記憶體洩露 : memory leak 指程

記憶體洩露記憶體溢位

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory; 記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

記憶體溢位記憶體洩漏記憶體抖動

記憶體溢位,記憶體洩漏,記憶體抖動你都碰到過嗎?怎麼解決的?如何區分這幾種情況?怎麼解決由記憶體洩漏而導致的記憶體溢位? 記憶體優化 . 記憶體洩露 記憶體溢位 記憶體抖動 分析與解決 記憶體溢位和記憶體洩漏的區別、產生原因以及解決方案 一、記憶體溢位: (一)、定義: 記憶體溢

使用JProfiler進行記憶體分析-----記憶體洩露分析記憶體檔案

今天專案組其他同事遇到記憶體洩露的問題。我記得之前在Eclipse中有Eclipse自帶的外掛某某version檢視Dump檔案 現在換成了IDEA工具,同事使用JProfiler檔案進行記憶體分析,記錄一筆 使用JProfiler進行記憶體分析 在最近的工作中,通過JProfiler解

C++面試常見題目4_記憶體管理記憶體洩露

記憶體管理 定義:記憶體管理是指軟體執行時對計算機記憶體資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,並且在適當的時候釋放和回收記憶體資源。 在C++中記憶體分為5個區,分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。 堆:堆是

記憶體洩露記憶體溢位的區別

· 記憶體洩露是指程式中間動態分配了記憶體,但在程式結束時沒有釋放這部分記憶體,從而造成那部分記憶體不可用的情況,重啟計算機可以解決,但也有可能再次發生記憶體洩露,記憶體洩露和硬體沒有關係,它是由軟體設計缺陷引起的。  · 記憶體洩漏可以分為4類:  1) 常發性記憶體洩漏。發生記憶體洩漏的程式碼會被多次執

記憶體洩漏記憶體溢位ANR

Android記憶體洩漏的檢測流程、捕捉以及分析 通常記憶體洩漏的隱藏性質比較強,不同於異常導致的程式Crash,在異常導致的Crash中,我們能夠及時的發現程式問題的存在,並通過log日誌定位到問題所在的具體位置,然後及時進行解決,而記憶體洩漏則不同,在APP中存在記

如何檢測記憶體洩露如何進行記憶體優化? 【面試題】

如何檢測記憶體洩露,如何進行記憶體優化?     答:RAM和ROM 是什麼?   記憶體溢位更多的再java記憶體中。 Android系統為每一個應用程式都設定了一個硬性的DalvikHeap Size最大限制閾值,這個閾值在不同的裝置上會

iOS開發記憶體優化之自動檢測記憶體洩露檢查是否有迴圈引用檢查記憶體為何如此大Block迴圈引用的檢查

手機裝置的記憶體是一個共享資源。應用程式可能會不當的耗盡記憶體、崩潰,或者遭遇大幅度的效能降低。 Facebook iOS客戶端有很多功能,並且它們共享同一塊記憶體空間。如果任何特定的功能消耗過多的記憶體,就會影響到整個應用程式。這是可能發生的,比如,這個功能導致了記

記憶體洩露記憶體溢位以及解決方法

記憶體洩露是指程式在執行過程中動態申請的記憶體空間不再使用後沒有及時釋放,從而很可能導致應用程式記憶體無線增長。更廣義的記憶體洩露包括未對系統的資源的及時釋放,比如控制代碼等。 記憶體溢位即使用者在對其資料緩衝區操作時,超過了其緩衝區的邊界;尤其是對緩衝區寫操作時,緩衝區的

Android】開發優化之——調優工具:dump hprof file 檢視記憶體情況找到記憶體洩露androidhprof

如何用MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse: 1.開啟Eclipse 2.選擇 Help->Install New Software; 3.在Work with中新增站點:download.eclipse.org/mat/1.0/update-site/(這

c語言-記憶體洩露記憶體溢位的區別

記憶體溢位     指你申請了10個位元組的空間,但是你在這個空間寫入11或以上位元組的資料,就是溢位 記憶體洩漏     指你用malloc或new申請了一塊記憶體,但是沒有通過free或delete將記憶體釋放,導致這塊記憶體一直處於佔用狀態。 #includ

JVM記憶體洩露記憶體溢位的區別

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位。 記憶體洩露 memory leak,是指程式在申請記憶體後,無

記一次匿名內部類引起的記憶體洩露contentResolver引起的洩露

公司開發的自動化測試工具發現有記憶體洩露。匯出當時的.hprof檔案(紅框),匯入到MAT中,點選Historian,然後搜尋關鍵字“Activity",過濾出瞭如下一些資料:大概掃了一眼,只有三個我們自己實現的類,其他的都是系統api的類,而數量為1的類也就只有com.an

Android面試準備:記憶體洩露記憶體溢位

概念 記憶體洩露:申請的記憶體沒有及時釋放掉,這樣的話就會造成程式能使用的記憶體資源越來越少,最終會導致系統無法再提供記憶體資源; 譬如說,一個map裡面一直在新增新的物件,這樣的話就很有可能造成記憶體洩露。 記憶體溢位:就是要求分配的記憶體超出了系統提供

Android之記憶體洩露記憶體溢位記憶體抖動分析

記憶體 JAVA是在JVM所虛擬出的記憶體環境中執行的,記憶體分為三個區:堆、棧和方法區。 棧(stack):是簡單的資料結構,程式執行時系統自動分配,使用完畢後自動釋放。優點:速度快。 堆(heap):用於存放由new建立的物件和陣列。在堆中分配的記憶體,一方面由jav

解釋:記憶體溢位記憶體洩露記憶體越界、緩衝區溢位、棧溢位

記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足 需求,於是產生溢位。 ================================================================ 記憶體洩漏是指你向系統申請分配記憶體進行使用