建立進程分配內存塊
內存塊中有堆,棧,靜態存儲區
靜態存儲區,存放靜態數據,全局static數據和常量;
堆,存放對象;
棧,當進程中建立了線程,分給線程一個棧,用於存放局部變量;
函數開始執行時,局部變量的存儲單元在棧上建立,當函數執行結束,釋放這些存儲單元;算法
堆是不連續的,堆的空間比較大,
棧是連續的內存區域,空間比較小函數
問題:
1)如何給成員變量分配內存?
成員變量所有存儲於堆中(包括基本數據類型,對象引用和引用指向的對象實體),由於它們屬於類;
2)int i= 1; 1存放在哪裏?工具
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; }
1)Dalvik虛擬機的內存分配
2)ART的內存分配code
1)尋找應該回收的對象;
2)回收對象;對象
1) 引用計數
2)標記-清除
3)標記-清除-壓縮
4)複製
5)增量
6)分代生命週期
GC-Roots:程序的主要運行對象,如靜態對象/寄存器/棧上指向的內存對象等;
GC-Root可達:從GC-Root開始,經過所持有引用的能夠獲取到的對象是GC-Root可達的,
剩下的對象是GC-Root不可達的,是GC回收的對象;seo
1)GC-Root持有對象的引用,static,final;
2)線程持有對象的引用,形成對象的生命週期同線程的生命週期相同;
3)內部類持有外部類的引用,形成外部類的對象的生命週期與內部類的對象生命週期相同;進程
1)Bitmap內存
1.Heap Viewer
2.Allocation