導航:首頁 > 操作系統 > android程序內存溢出

android程序內存溢出

發布時間:2023-03-02 07:45:55

1. android 內存溢出和內存泄漏的區別

內存溢出是指當對象的內存佔用已經超出分配內存的空間大小,這時未經處理的異常就會拋出。比如常見的內存溢出情況有:bitmap過大;引用沒釋放;資源對象沒關閉
如圖,這是常見的bitma對象的溢出,顯示像素過高或圖片尺寸遠遠大於顯示空間的尺寸時,通常都要將其縮放,減小佔用內存。
內存泄漏(memory
leak)
有些對象只有有限的生命周期。當它們的任務完成之後,它們將被垃圾回收。如果在對象的生命周期本該結束的時候,這個對象還被一系列的引用,這就會導致內存泄漏。隨著泄漏的累積,app將消耗完內存。
比如,在Activity.onDestroy()被調用之後,view樹以及相關的bitmap都應該被垃圾回收。如果一個正在運行的後台線程繼續持有這個Activity的引用,那麼相關的內存將不會被回收,這最終將導致OutOfMemoryError崩潰。
memory
leak會最終會導致out
of
memory!
如圖,這是使用MAT工具查找內存泄漏的結果,例子是
handle
延時發送
message
而在關閉
activity

context
被銷毀所引發的泄漏,這是作為目的性的測試所以問題比較容易找到,在實際開發中內存泄漏不易察覺並難以找到,當泄漏累積到一定程度是會引發
OOM
的。

2. android scrollview內存溢出怎麼解決

android scrollview內存溢出通常是由內存泄露導致。
1、內存泄露導致
由於我們程序的失誤,長期保持某些資源(如Context)的引用,垃圾回收器就無法回收它,當然該對象佔用的內存就無法被使用,這就造成內存泄露。
Android 中常見就是Activity被引用在調用finish之後卻沒有釋放,第二次打開activity又重新創建,這樣的內存泄露不斷的發生,則會導致內存的溢出。
Android的每個應用程序都會使用一個專有的Dalvik虛擬機實例來運行,它是由Zygote服務進程孵化出來的,也就是說每個應用程序都是在屬於自己的進程中運行的。Android為不同類型的進程分配了不同的內存使用上限,如果程序在運行過程中出現了內存泄漏的而造成應用進程使用的內存超過了這個上限,則會被系統視為內存泄漏,從而被kill掉,這使得僅僅自己的進程被kill掉,而不會影響其他進程.
2、佔用內存較多的對象
保存了多個耗用內存過大的對象(如Bitmap)或載入單個超大的圖片,造成內存超出限制。
使用方法比較簡單:
· 選擇DDMS視圖,並打開Devices視圖和Heap視圖
· 點擊選擇要監控的進程,比如:上圖中我選擇的是system_process
· 選中Devices視圖界面上的"update heap" 圖標
· 點擊Heap視圖中的"Cause GC" 按鈕(相當於向虛擬機發送了一次GC請求的操作)
在Heap視圖中選擇想要監控的Type,一般我們會觀察dataobject的 total size的變化,正常情況下total size的值會穩定在一個有限的范圍內,也就說程序中的代碼良好,沒有造成程序中的對象不被回收的情況。如果代碼中存在沒有釋放對象引用的情況,那麼data object的total size在每次GC之後都不會有明顯的回落,隨著操作次數的增加而total size也在不斷的增加。(說明:選擇好data object後,不斷的操作應用,這樣才可以看出total size的變化)。如果totalsize確實是在不斷增加而沒有回落,說明程序中有沒有被釋放的資源引用。那麼我們應該怎麼來定位呢?
Android中內存泄露定位
通過DDMS工具可以判斷應用程序中是否存在內存泄漏的問題,那又如何定位到具體出現問題的代碼片段,最終找到問題所在呢?內存分析工具MAT Memory Analyzer Tool解決了這一難題。MAT工具是一個Eclipse 插件,同時也有單獨的RCP 客戶端,MAT工具的解析文件是.hprof,這個文件存放了某進程的內存快照。MAT工具定位內存泄漏具體位置的方法如下:
① 生成.hprof文件。Eclipse中生成.hprof文件的方法有很多,不同Android版本中生成.hprof的方式也稍有差別,但它們整體思路是一樣的。我們在DDMS界面選中想要分析的應用進程,在Devices視圖界面上方的一行圖標按鈕中,同時選中「Update Heap」和「Dump HPROF file」兩個按鈕,這時DDMS將會自動生成當前選中進程的.hprof文件。
② 將.hprof 文件導入到MAT工具中,MAT工具會自動解析並生成報告,點擊「Dominator Tree」按鈕,並按包分組,選擇已定義的包類點右鍵,在彈出的菜單中選擇List objects﹥With incoming references,這時會列出所有可疑的類。右鍵點擊某一項,並選擇Path to GC Roots﹥excludeweak/soft references,MAT工具會進一步篩選出跟程序相關的所有內存泄漏的類。這樣就可以追蹤到某一個產生內存泄漏的類的具體代碼中。
使用MAT內存分析工具查找內存泄漏的根本思路是找到哪個類的對象的引用沒有被釋放,然後分析沒有被釋放的原因,最終定位到代碼中哪些片段存在著內存泄漏。

3. Android 內存溢出和內存泄漏的區別

區別:
內存溢出就是要求分配的內存超出了系統能給的,系統不能滿足需求,於是產生溢出。
內存泄漏是指向系統申請分配內存進行使用(new),可是使用完了以後卻不歸還(delete),結果申請到的那塊內存自己也不能再訪問(也許把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序。
一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。就是分配的內存不足以放下數據項序列,稱為內存溢出.
定義:
1.內存溢出 out of memory
是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。
2.內存泄露 memory leak
是指程序在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存,遲早會被佔光。
3.二者的聯系

內存泄露最終會導致內存溢出

閱讀全文

與android程序內存溢出相關的資料

熱點內容
同態加密gpu 瀏覽:216
程序員告訴你網賭為什麼贏不了 瀏覽:971
程序員最帥操作 瀏覽:72
雲伺服器可以隨時更換嗎 瀏覽:489
老款車在哪裡可以買到app 瀏覽:460
程序員事業單位 瀏覽:68
特來電需要用哪個App 瀏覽:881
電腦如何共享其他伺服器 瀏覽:260
php網站性能優化 瀏覽:354
被子收納袋壓縮真空 瀏覽:30
h1z1選什麼伺服器 瀏覽:484
蘋果版三國殺怎麼在安卓上下載 瀏覽:728
安潤國際app在哪裡下載 瀏覽:438
iospdf教程下載 瀏覽:332
加密貨幣換手率300表示什麼 瀏覽:727
手機wps新建文件夾存照片 瀏覽:399
單片機rgbled 瀏覽:963
怎麼通過文件加密後發給微信好友 瀏覽:90
用虛擬機編程 瀏覽:821
公司代理伺服器有什麼要求 瀏覽:244