當前位置:首頁 » 安卓系統 » android圖片內存溢出

android圖片內存溢出

發布時間: 2022-09-13 15:18:30

Ⅰ Android 內存溢出怎麼解決

Android 內存溢出的原因和解決方案如下:
1.Android的虛擬機是基於寄存器的Dalvik,它的最大堆大小一般是16M,有的機器為24M.因此我們所能利用的內存空間是有限的.如果我們的內存佔用超過了一定的水平就會出現OutOfMemory的錯誤.原因主要有兩個:
l 由於我們程序的失誤,長期保持某些資源(如Context)的引用,造成內存泄露,資源造成得不到釋放.
l 保存了多個耗用內存過大的對象(如Bitmap),造成內存超出限制.
2. Static
static是java中的一個關鍵字,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的實例.所以用static修飾的變數,它的生命周期是很長的,如果用它來引用一些資源耗費過多的實例(Context的情況最多)就要謹慎對待了.例如xxx源碼:
public class IntentMapping {
private static Contextcontext;
//. . .
}

Ⅱ Android createBitmap創建大尺寸圖像時,內存溢出out of memory(OOM)

BitmapFactory.Options bfOptions=new BitmapFactory.Options();
bfOptions.inDither=false;//使圖片不抖動。不是很懂
bfOptions.inPurgeable=true;//使得內存可以被回收
bfOptions.inTempStorage=new byte[12 * 1024]; //臨時存儲
File file = new File(path);//path:圖片的絕對地址
FileInputStream fs=null;
try {
fs = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bmp = null;
if(fs != null) {
try {
bmp = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions); //這樣莫非就讓bmp到了臨時存儲的位置?
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fs!=null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
轉的。
http://wenku..com/view/c7b20053ad02de80d4d840f9.html

Ⅲ Android 內存溢出和內存泄漏的區別

內存溢出是指當對象的內存佔用已經超出分配內存的空間大小,這時未經處理的異常就會拋出。比如常見的內存溢出情況有:bitmap過大;引用沒釋放;資源對象沒關閉

如圖,這是使用MAT工具查找內存泄漏的結果,例子是 handle 延時發送 message 而在關閉 activity 後 context 被銷毀所引發的泄漏,這是作為目的性的測試所以問題比較容易找到,在實際開發中內存泄漏不易察覺並難以找到,當泄漏累積到一定程度是會引發 OOM 的。

Ⅳ android 總是內存溢出,網上說的好多種,有壓縮的,軟引用之類的,有過經驗的大神們是怎樣解決這類問題的

一般android的內存比較大,如果出現內存溢出,證明:
1、 代碼質量問題,代碼中有易造成內存泄露的代碼。
2。、Android的棧空間的確不大, 避免過多次數調用遞歸。 如果遞歸過多又無法避免遞歸, 請在遞歸函數體內少生成使用局部變數,臨時變數。
先檢查第2點,如果沒有第2點的情況就好好看看第1點是不是有問題搜索。
樓主的問題我也曾出現過。 原因是解析一個 120K的xml文件時,我採用dom解析我的對象, 遞歸方式, 每次節點都生成一堆臨時變數,導致內存溢出

Ⅳ 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內存分析工具查找內存泄漏的根本思路是找到哪個類的對象的引用沒有被釋放,然後分析沒有被釋放的原因,最終定位到代碼中哪些片段存在著內存泄漏。

Ⅵ 如何避免Android應用出現內存溢出OutOfMemoery

一、內存溢出 現在的智能手機內存已經足夠大,但是對於一個應用程序來說智能手機當中稀缺的內存,仍然是應用程序的一大限制。在Android應用程序開發當中,最常見的內存溢出問題(OOM)是在載入圖片時出現的,尤其是在不知道圖片大小的情況下。 潛在的內存溢出操作主要包括以下幾點: 1、從網路當中載入用戶特定的圖片。因為直到我們在下載圖片的時候我們才知道圖片的大小。 2、向Gallery載入圖片。因為現在智能手機的攝像頭有很高的解析度,在載入圖片的時候需要最圖片進行處理,然後才能正常的使用。 請注意一點,Android系統是從系統全局的觀念來分配內存以載入圖片的,這就意味著,即使你的應用有足夠大的內存可用,內存溢出問題(out of memroy,OOM)仍然可能出現,因為所有的應用共享一個載入圖片的內存池(我們使用BitmapFactory進行解析)。 二、解決內存溢出問題 原文(Downsampling為了好理解,解釋為,程序A)。程序A通過調整像素,同時使其均衡化來降低圖片的解析度。因為不管問題圖片是因為太大而不能再手機上正常顯現,這個圖片都會縮短其寬度以在ImageView當中顯示,當圖片在ImageView當中顯示時,我們會因為載入一些沒有必要的原始圖片而浪費掉內存。 因此,更加有效的載入圖片的時機是在其初始化處理的時候。 以下是處理代碼: 1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){2:3: BitmapFactory.Options options = new BitmapFactory.Options(); 14: options.inSampleSize = ssize;15:16: Bitmap bm = null;17: try{18: bm = decode(path, data, options); 19: }catch(OutOfMemoryError e){ 39: result = result * 2;40:41: }42:43: return result;44: }三、AQuery當在Android應用程序開發當中使用AQuery組件時,處理這個問題會變的更加的簡單。

Ⅶ android中用viewflipper來放大量圖片時,內存溢出,求助

創建太多圖片而不注意回收容易導致內存溢出啊點陣圖很占內存的,而且占的好像是native內存建議創建圖片用弱引用包裝
或者
自己回收一下

Ⅷ 如何定位和解決android的內存溢出問題

進公司的第一個項目就遇到了一個比較難纏的客戶,不過總算對付過去了。在第一個項目中由於app載入的圖片、報表比較多,所以經常報出內存溢出的錯誤,很是頭疼。不過在project leader的帶領下,基本算是解決了。在此感謝一下my leader,Samuel.Cai辛苦了。哈哈......
以下是一些總結,ps:從我leader那邊搞過來的,和大家分享一下,哈哈
1. 當項目中包含大量圖片,或者圖片過大,可能會oom

方法1 : 等比例縮小圖片

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

方法2 : 對圖片採用軟引用,及時地進行recyle()操作

SoftReference<Bitmap> bitmap;
bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}

方法3 : 對復雜的listview進行合理設計與編碼:
1. 注意重用Adapter裡面的 convertView 以及holder機制的運用 ----- 參考資料: api demo list 14. Efficient Adapter

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];
for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}
v.setTag(holder);
} else {



2. 上述方法嘗試還未成功,可用 lazy loading data ----- 參考資料:api demo list 13

方法4 : 單個頁面,橫豎屏切換N次後 OOM
1. 看看頁面布局當中有沒有大的圖片,比如背景圖之類的。去除xml中相關設置,改在程序中設置背景圖(放在onCreate()方法中):
Drawable bg = getResources().getDrawable(R.drawable.bg);
XXX.setBackgroundDrawable(rlAdDetailone_bg);
在Activity destory時注意,bg.setCallback(null); 防止Activity得不到及時的釋放

2. 跟上面方法相似,直接把xml配置文件載入成view 再放到一個容器里,然後直接調用 this.setContentView(View view);方法

避免xml的重復載入

方法5 : 在頁面切換時盡可能少地重復使用一些代碼,比如:重復調用資料庫,反復使用某些對象等等......

方法6 :Android堆內存也可自己定義大小 和 優化Dalvik虛擬機的堆內存分配
注意若使用這種方法:project build target 只能選擇 <= 2.2 版本,否則編譯將通不過。 所以不建議用這種方式

private final static int CWJ_HEAP_SIZE= 6*1024*1024;
private final static float TARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

Ⅸ 在android開發中載入的圖片太大,有好幾十兆,應該怎麼辦

如果圖片太大會造成OOM內存溢出的錯誤,需要用Bitmap的壓縮機制。
解決方案:
1.使用BitmapFactory.decodeStream替代createBitmap方法
原因是該方法直讀取圖片位元組,調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap。

2.使用壓縮讀取技術
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inSampleSize = 1;
int w = 320;
int h = 480;
h = w*height/width;//計算出寬高等比率
int a = options.outWidth/ w;
int b = options.outHeight / h;
options.inSampleSize = Math.max(a, b);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);

3.及時釋放Bitamp
Bitmap對象在不使用時,我們應該先調用recycle()釋放內存,然後才它設置為null.雖然recycle()從源碼上看,調用它應該能立即釋放Bitmap的主要內存,但是測試結果顯示它並沒能立即釋放內存。但是我它應該還是能大大的加速Bitmap的主要內存的釋放。

Ⅹ Android 內存溢出和內存泄漏的區別

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

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

熱點內容
傳奇榮耀腳本 發布:2025-01-07 05:53:14 瀏覽:979
為什麼安卓手機連接不了蘋果耳機 發布:2025-01-07 05:37:49 瀏覽:75
c語言mfc 發布:2025-01-07 05:33:18 瀏覽:592
自己搭建郵件伺服器ddns 發布:2025-01-07 05:19:29 瀏覽:205
光碟機無法訪問指定設備 發布:2025-01-07 05:17:19 瀏覽:104
如何刪除人人網的訪問記錄 發布:2025-01-07 05:02:47 瀏覽:281
清華編譯原理第2版答案pdf 發布:2025-01-07 04:48:03 瀏覽:936
pythonweb框架對比 發布:2025-01-07 04:48:00 瀏覽:606
交叉編譯應用程序示例 發布:2025-01-07 04:47:59 瀏覽:649
華為t系列存儲 發布:2025-01-07 04:36:40 瀏覽:909