Android O 8.0 以上 bitmap記憶體分配

❀卜卜ღ?Bruce發表於2019-03-12

From Android 3.0 (API level 11) through Android 7.1 (API level 25),the pixel data is stored on the Dalvik heap along with the associated bitmap. In Android 8.0 (API level 26), and higher, the bitmap pixel data is stored in the native heap.
官方原文說道 android 3.0 到7.1 bitmap是放在dalvik heap中, 8.0 以後放在native heap中, 具體參見原始碼也可以看到。 如下程式碼,會分配差不多2G的空間(53000100004位元組)

        logMem();
        Bitmap bitmap = Bitmap.createBitmap(53000,10000, Bitmap.Config.ARGB_8888);
//        Canvas canvas = new Canvas(bitmap);
//        canvas.drawColor(Color.RED);
        logMem();
複製程式碼

通過

    private void logMem(){
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
        activityManager.getMemoryInfo(memoryInfo);
        Log.d("Bruce","memoryInfo.availMem :" + memoryInfo.availMem/1024/1024);
        Log.d("Bruce","NativeHeapAllocatedSize :" + Debug.getNativeHeapAllocatedSize()/1024/1024);

    }
複製程式碼

列印如下:
memoryInfo.availMem :2393
NativeHeapAllocatedSize :16
memoryInfo.availMem :2349
NativeHeapAllocatedSize :2065

發現android的可用記憶體基本沒變化,但是nativeHeap已經分配了bitmap所需要的空間。

native記憶體佔用
但是實際記憶體並沒有佔用。 以下程式碼效果同上。

        logMem();
        Bitmap bitmap = Bitmap.createBitmap(53000,10000, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
//        canvas.drawColor(Color.RED);
        logMem();
複製程式碼

重點

下面程式碼將會出現不同

        logMem();
        Bitmap bitmap = Bitmap.createBitmap(53000,10000, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawColor(Color.RED);
        logMem();
複製程式碼

log如下:
memoryInfo.availMem :2394
NativeHeapAllocatedSize :9
memoryInfo.availMem :369
NativeHeapAllocatedSize :2057
發現當在bitmap上繪畫的時候 才開始正真佔用記憶體。

native記憶體佔用
可以看到native這個時候佔用了2G的記憶體。

相關文章