Android內存優化

一.內存分配

1.內存結構

建立進程分配內存塊
內存塊中有堆,棧,靜態存儲區
靜態存儲區,存放靜態數據,全局static數據和常量;
堆,存放對象;
棧,當進程中建立了線程,分給線程一個棧,用於存放局部變量;
函數開始執行時,局部變量的存儲單元在棧上建立,當函數執行結束,釋放這些存儲單元;算法

堆是不連續的,堆的空間比較大,
棧是連續的內存區域,空間比較小函數

問題:
1)如何給成員變量分配內存?
成員變量所有存儲於堆中(包括基本數據類型,對象引用和引用指向的對象實體),由於它們屬於類;
2)int i= 1; 1存放在哪裏?工具

2.內存分配的流程

1)申請內存;
2)申請成功,結束;申請失敗,GC,再次申請;
3)申請成功,結束;申請失敗,增長堆的大小,再次申請;
4)申請成功,結束;申請失敗,GC,再次申請;
5)申請成功,結束;申請失敗,OOM;線程

void* dvmMalloc(size_t size, int flags)  
{  
    void *ptr;  
  
    dvmLockHeap();  
  
    /* Try as hard as possible to allocate some memory. 
     */  
    ptr = tryMalloc(size);  
    if (ptr != NULL) {  
        /* We've got the memory. 
         */  
        if (gDvm.allocProf.enabled) {  
            Thread* self = dvmThreadSelf();  
            gDvm.allocProf.allocCount++;  
            gDvm.allocProf.allocSize += size;  
            if (self != NULL) {  
                self->allocProf.allocCount++;  
                self->allocProf.allocSize += size;  
            }  
        }  
    } else {  
        /* The allocation failed. 
         */  
  
        if (gDvm.allocProf.enabled) {  
            Thread* self = dvmThreadSelf();  
            gDvm.allocProf.failedAllocCount++;  
            gDvm.allocProf.failedAllocSize += size;  
            if (self != NULL) {  
                self->allocProf.failedAllocCount++;  
                self->allocProf.failedAllocSize += size;  
            }  
        }  
    }  
  
    dvmUnlockHeap();  
  
    if (ptr != NULL) {  
        /* 
         * If caller hasn't asked us not to track it, add it to the 
         * internal tracking list. 
         */  
        if ((flags & ALLOC_DONT_TRACK) == 0) {  
            dvmAddTrackedAlloc((Object*)ptr, NULL);  
        }  
    } else {  
        /* 
         * The allocation failed; throw an OutOfMemoryError. 
         */  
        throwOOME();  
    }  
  
    return ptr;  
}
static void *tryMalloc(size_t size)  
{  
    void *ptr;  
    ......  
  
    ptr = dvmHeapSourceAlloc(size);  
    if (ptr != NULL) {  
        return ptr;  
    }  
  
    if (gDvm.gcHeap->gcRunning) {  
        ......  
        dvmWaitForConcurrentGcToComplete();  
    } else {  
        ......  
        gcForMalloc(false);  
    }  
  
    ptr = dvmHeapSourceAlloc(size);  
    if (ptr != NULL) {  
        return ptr;  
    }  
  
    ptr = dvmHeapSourceAllocAndGrow(size);  
    if (ptr != NULL) {  
        ......  
        return ptr;  
    }  
  
    gcForMalloc(true);  
    ptr = dvmHeapSourceAllocAndGrow(size);  
    if (ptr != NULL) {  
        return ptr;  
    }  
     
    ......  
  
    return NULL;  
}

3.Android的內存分配

1)Dalvik虛擬機的內存分配
2)ART的內存分配code

二.內存回收-GC

1.Java的GC

GC針對的是堆內存;

GC的步驟:

1)尋找應該回收的對象;
2)回收對象;對象

GC算法:

1) 引用計數
2)標記-清除
3)標記-清除-壓縮
4)複製
5)增量
6)分代生命週期

GC-Roots:程序的主要運行對象,如靜態對象/寄存器/棧上指向的內存對象等;
GC-Root可達:從GC-Root開始,經過所持有引用的能夠獲取到的對象是GC-Root可達的,
剩下的對象是GC-Root不可達的,是GC回收的對象;seo

2.Android的GC

三.內存問題

內存使用不合理引起的問題:

1.OOM

2.GC過多,影響程序的運行

內存使用不合理

1.內存泄漏

1)GC-Root持有對象的引用,static,final;
2)線程持有對象的引用,形成對象的生命週期同線程的生命週期相同;
3)內部類持有外部類的引用,形成外部類的對象的生命週期與內部類的對象生命週期相同;進程

2.內存佔用較大的對象

1)Bitmap內存

四.內存檢測工具

1.Heap Viewer
2.Allocation

參考:https://www.jianshu.com/p/310...

相關文章
相關標籤/搜索