2015-10-23 39 views

回答

3

位圖對象Bitmap class的一個實例。雖然我沒有位於前面的Bitmap類的源代碼,但我認爲它具有以下私有成員變量:寬度,高度,顏色深度,「具有alpha通道」,dpi等......也就是說,所有關於圖像本身的元數據,即程序或渲染器可能需要了解的圖像。

支持像素數據是從源文件解碼的實際未壓縮(A)RGB字節,用於創建此位圖對象的實例。因此,如果位圖代表從JPEG加載的640x480 24位圖像,則可能會在某處分配640x480x3字節的後備陣列,並且是Bitmap類的私有成員。像getPixel和setPixel這樣的方法直接在數組上工作。

至於Dalvik與原生記憶的東西。需要記住的是Bitmap對象使用大量內存。如果您的代碼引用了太多的Bitmap對象,則可能會導致內存不足。

從你列出的網站鏈接的完整報價:

要設置本課程的舞臺,這裏是位圖內存的Android的管理是如何演變: 在Android的Android 2.2(API級別8)較低,當收集垃圾 發生時,您的應用程序線程停止。這會導致可能降低性能的滯後 。 Android 2.3增加了併發垃圾 集合,這意味着在不再引用 位圖後,內存很快就會被回收。

在Android 2.3.3(API級別10)和 以下,位圖的後備像素數據存儲在本機內存中。 它與位圖本身是分開的,它存儲在Dalvik 堆中。本機內存中的像素數據不會以可預測的方式發佈,可能會導致應用程序短暫超出其內存限制和崩潰。從Android 3.0(API級別11)開始,像素 數據與相關聯的位圖一起存儲在Dalvik堆上。

該報價試圖說是這樣的。位圖使用大量內存,因爲它們通常由大內存分配支持以保存ARGB字節。在今天的Android操作系統中,與位圖相關聯的ARGB字節在不再被引用時會與Bitmap對象一起被垃圾收集。因此,只要您沒有Bitmap類實例的參考泄漏,垃圾收集器就會做正確的事情,並防止您耗盡內存 - 正如任何程序員可能想要的和期望的那樣。

在早期版本的Android上,ARGB字節由獨立於應用程序自己的Java/Dalvik運行時的不同運行時和垃圾回收器管理。因此,在較舊的Android模型中,僅僅因爲Bitmap對象本身被垃圾收集清理,圖像字節可能會在稍後清理。因此,如果您要非常快速地連續加載和釋放許多位圖,則即使您確實做了所有更正,以確保您的Java代碼管理的位圖對象不再被引用,也可能會導致內存不足。

+0

感謝您的解釋確實有幫助 – Avi

相關問題