OOM(Out Of Memory,內(nèi)存溢出)是指程序在申請(qǐng)內(nèi)存的時(shí)候晾匠,沒有足夠的內(nèi)存空間供其使用茶袒,出現(xiàn) Out Of Memory。比如申請(qǐng)了一個(gè)float凉馆,但給它存了double才能存下的數(shù)據(jù)薪寓,這就是內(nèi)存溢出。
當(dāng)我們的應(yīng)用程序申請(qǐng)的內(nèi)存資源超過(guò)Android系統(tǒng)為每個(gè)進(jìn)程設(shè)置的最大內(nèi)存限制時(shí)澜共,系統(tǒng)就會(huì)拋出OOM錯(cuò)誤向叉。
1、查看手機(jī)每個(gè)應(yīng)用程序最高可用內(nèi)存
// 每個(gè)應(yīng)用程序最高可用內(nèi)存
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 使用Log打印出來(lái)
Log.i("TAG", "Max memory is " + maxMemory + "KB");
2嗦董、每個(gè)程序都會(huì)有可使用的內(nèi)存上限母谎,這被稱為堆大小(Heap Size)京革。
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 堆大小
int heapSize = manager.getMemoryClass();
// 使用Log打印出來(lái)
Log.i("TAG", "Heap size is " + heapSize + "MB");
注意:以上兩種方式查看的內(nèi)存大小是一樣的奇唤。
避免OOM的常見方法
1幸斥、避免不必要的大圖載入,在把圖片載入內(nèi)存之前咬扇,先計(jì)算出一個(gè)合適的縮放比例甲葬,然后再載入。
2懈贺、采用低內(nèi)存占用量的編碼方式经窖,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省內(nèi)存。
3梭灿、使用圖像緩存画侣,比如在ListView中加載大量圖片時(shí),只加載屏幕顯示的資源堡妒,尚未顯示的不加載配乱;移出屏幕的資源及時(shí)釋放。
4皮迟、不要在循環(huán)中創(chuàng)建過(guò)多的本地變量宪卿,慎用static。用static來(lái)修飾成員變量時(shí)万栅,該變量就屬于該類佑钾,而不是該類實(shí)例,它的生命周期是很長(zhǎng)的烦粒。
5休溶、自定義堆內(nèi)存分配大小。