摘要:一內(nèi)存分配內(nèi)存結(jié)構(gòu)創(chuàng)建進程分配內(nèi)存塊內(nèi)存塊中有堆,棧,靜態(tài)存儲區(qū)靜態(tài)存儲區(qū),存放靜態(tài)數(shù)據(jù),全局數(shù)據(jù)和常量堆,存放對象棧,當進程中創(chuàng)建了線程,分給線程一個棧,用于存放局部變量函數(shù)開始執(zhí)行時,局部變量的存儲單元在棧上創(chuàng)建,當函數(shù)執(zhí)行結(jié)束,釋放這
一.內(nèi)存分配 1.內(nèi)存結(jié)構(gòu)
創(chuàng)建進程分配內(nèi)存塊
內(nèi)存塊中有堆,棧,靜態(tài)存儲區(qū)
靜態(tài)存儲區(qū),存放靜態(tài)數(shù)據(jù),全局static數(shù)據(jù)和常量;
堆,存放對象;
棧,當進程中創(chuàng)建了線程,分給線程一個棧,用于存放局部變量;
函數(shù)開始執(zhí)行時,局部變量的存儲單元在棧上創(chuàng)建,當函數(shù)執(zhí)行結(jié)束,釋放這些存儲單元;
堆是不連續(xù)的,堆的空間比較大,
棧是連續(xù)的內(nèi)存區(qū)域,空間比較小
問題:
1)如何給成員變量分配內(nèi)存?
成員變量全部存儲于堆中(包括基本數(shù)據(jù)類型,對象引用和引用指向的對象實體),因為它們屬于類;
2)int i= 1; 1存放在哪里?
1)申請內(nèi)存;
2)申請成功,結(jié)束;申請失敗,GC,再次申請;
3)申請成功,結(jié)束;申請失敗,增加堆的大小,再次申請;
4)申請成功,結(jié)束;申請失敗,GC,再次申請;
5)申請成功,結(jié)束;申請失敗,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的內(nèi)存分配
1)Dalvik虛擬機的內(nèi)存分配
2)ART的內(nèi)存分配
1)尋找應該回收的對象;
2)回收對象;
1) 引用計數(shù)
2)標記-清除
3)標記-清除-壓縮
4)復制
5)增量
6)分代
GC-Roots:程序的主要運行對象,如靜態(tài)對象/寄存器/棧上指向的內(nèi)存對象等;
GC-Root可達:從GC-Root開始,通過所持有引用的可以獲取到的對象是GC-Root可達的,
剩下的對象是GC-Root不可達的,是GC回收的對象;
1)GC-Root持有對象的引用,static,final;
2)線程持有對象的引用,造成對象的生命周期同線程的生命周期相同;
3)內(nèi)部類持有外部類的引用,造成外部類的對象的生命周期與內(nèi)部類的對象生命周期相同;
1)Bitmap
四.內(nèi)存檢測工具1.Heap Viewer
2.Allocation
參考:https://www.jianshu.com/p/310...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68131.html
摘要:導語智能手機發(fā)展到今天已經(jīng)有十幾個年頭,手機的軟硬件都已經(jīng)發(fā)生了翻天覆地的變化,特別是陣營,從一開始的一兩百到今天動輒,內(nèi)存。恰好最近做了內(nèi)存優(yōu)化相關(guān)的工作,這里也對內(nèi)存優(yōu)化相關(guān)的知識做下總結(jié)。 導語 智能手機發(fā)展到今天已經(jīng)有十幾個年頭,手機的軟硬件都已經(jīng)發(fā)生了翻天覆地的變化,特別是Android陣營,從一開始的一兩百M到今天動輒4G,6G內(nèi)存。然而大部分的開發(fā)者觀看下自己的異常上報系...
摘要:然而,中依然有可能發(fā)生內(nèi)存泄漏。所以你的安卓快速定位解決內(nèi)存泄漏掘金昨天是個好日子,程序員的節(jié)日,在這里給所有的程序員送上一份遲到的祝福。應用內(nèi)存泄漏的定位分析與解決策略掘金,大家好,我是。 Android 性能優(yōu)化之巧用軟引用與弱引用優(yōu)化內(nèi)存使用 - Android - 掘金前言: 從事Android開發(fā)的同學都知道移動設備的內(nèi)存使用是非常敏感的話題,今天我們來看下如何使用軟引用與弱...
閱讀 2671·2021-11-23 09:51
閱讀 1657·2021-11-22 13:54
閱讀 2793·2021-11-18 10:02
閱讀 953·2021-08-16 10:57
閱讀 3567·2021-08-03 14:03
閱讀 1882·2019-08-30 15:54
閱讀 3536·2019-08-23 14:39
閱讀 608·2019-08-23 14:26