国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android內(nèi)存優(yōu)化

hikui / 1188人閱讀

摘要:一內(nèi)存分配內(nèi)存結(jié)構(gòu)創(chuàng)建進(jìn)程分配內(nèi)存塊內(nèi)存塊中有堆,棧,靜態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū),存放靜態(tài)數(shù)據(jù),全局?jǐn)?shù)據(jù)和常量堆,存放對(duì)象棧,當(dāng)進(jìn)程中創(chuàng)建了線程,分給線程一個(gè)棧,用于存放局部變量函數(shù)開始執(zhí)行時(shí),局部變量的存儲(chǔ)單元在棧上創(chuàng)建,當(dāng)函數(shù)執(zhí)行結(jié)束,釋放這

一.內(nèi)存分配 1.內(nèi)存結(jié)構(gòu)

創(chuàng)建進(jìn)程分配內(nèi)存塊
內(nèi)存塊中有堆,棧,靜態(tài)存儲(chǔ)區(qū)
靜態(tài)存儲(chǔ)區(qū),存放靜態(tài)數(shù)據(jù),全局static數(shù)據(jù)和常量;
堆,存放對(duì)象;
棧,當(dāng)進(jìn)程中創(chuàng)建了線程,分給線程一個(gè)棧,用于存放局部變量;
函數(shù)開始執(zhí)行時(shí),局部變量的存儲(chǔ)單元在棧上創(chuàng)建,當(dāng)函數(shù)執(zhí)行結(jié)束,釋放這些存儲(chǔ)單元;

堆是不連續(xù)的,堆的空間比較大,
棧是連續(xù)的內(nèi)存區(qū)域,空間比較小

問(wèn)題:
1)如何給成員變量分配內(nèi)存?
成員變量全部存儲(chǔ)于堆中(包括基本數(shù)據(jù)類型,對(duì)象引用和引用指向的對(duì)象實(shí)體),因?yàn)樗鼈儗儆陬悾?br>2)int i= 1; 1存放在哪里?

2.內(nèi)存分配的流程

1)申請(qǐng)內(nèi)存;
2)申請(qǐng)成功,結(jié)束;申請(qǐng)失敗,GC,再次申請(qǐng);
3)申請(qǐng)成功,結(jié)束;申請(qǐng)失敗,增加堆的大小,再次申請(qǐng);
4)申請(qǐng)成功,結(jié)束;申請(qǐng)失敗,GC,再次申請(qǐng);
5)申請(qǐng)成功,結(jié)束;申請(qǐng)失敗,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虛擬機(jī)的內(nèi)存分配
2)ART的內(nèi)存分配

二.內(nèi)存回收-GC 1.Java的GC GC針對(duì)的是堆內(nèi)存; GC的步驟:

1)尋找應(yīng)該回收的對(duì)象;
2)回收對(duì)象;

GC算法:

1) 引用計(jì)數(shù)
2)標(biāo)記-清除
3)標(biāo)記-清除-壓縮
4)復(fù)制
5)增量
6)分代

GC-Roots:程序的主要運(yùn)行對(duì)象,如靜態(tài)對(duì)象/寄存器/棧上指向的內(nèi)存對(duì)象等;
GC-Root可達(dá):從GC-Root開始,通過(guò)所持有引用的可以獲取到的對(duì)象是GC-Root可達(dá)的,
剩下的對(duì)象是GC-Root不可達(dá)的,是GC回收的對(duì)象;

2.Android的GC 三.內(nèi)存問(wèn)題 內(nèi)存使用不合理引發(fā)的問(wèn)題: 1.OOM 2.GC過(guò)多,影響程序的運(yùn)行 內(nèi)存使用不合理 1.內(nèi)存泄漏

1)GC-Root持有對(duì)象的引用,static,final;
2)線程持有對(duì)象的引用,造成對(duì)象的生命周期同線程的生命周期相同;
3)內(nèi)部類持有外部類的引用,造成外部類的對(duì)象的生命周期與內(nèi)部類的對(duì)象生命周期相同;

2.內(nèi)存占用較大的對(duì)象

1)Bitmap

四.內(nèi)存檢測(cè)工具

1.Heap Viewer
2.Allocation

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68131.html

相關(guān)文章

  • Android性能優(yōu)化內(nèi)存優(yōu)化

    摘要:導(dǎo)語(yǔ)智能手機(jī)發(fā)展到今天已經(jīng)有十幾個(gè)年頭,手機(jī)的軟硬件都已經(jīng)發(fā)生了翻天覆地的變化,特別是陣營(yíng),從一開始的一兩百到今天動(dòng)輒,內(nèi)存。恰好最近做了內(nèi)存優(yōu)化相關(guān)的工作,這里也對(duì)內(nèi)存優(yōu)化相關(guān)的知識(shí)做下總結(jié)。 導(dǎo)語(yǔ) 智能手機(jī)發(fā)展到今天已經(jīng)有十幾個(gè)年頭,手機(jī)的軟硬件都已經(jīng)發(fā)生了翻天覆地的變化,特別是Android陣營(yíng),從一開始的一兩百M(fèi)到今天動(dòng)輒4G,6G內(nèi)存。然而大部分的開發(fā)者觀看下自己的異常上報(bào)系...

    cheng10 評(píng)論0 收藏0
  • 內(nèi)存 問(wèn)題- 收藏集 - 掘金

    摘要:然而,中依然有可能發(fā)生內(nèi)存泄漏。所以你的安卓快速定位解決內(nèi)存泄漏掘金昨天是個(gè)好日子,程序員的節(jié)日,在這里給所有的程序員送上一份遲到的祝福。應(yīng)用內(nèi)存泄漏的定位分析與解決策略掘金,大家好,我是。 Android 性能優(yōu)化之巧用軟引用與弱引用優(yōu)化內(nèi)存使用 - Android - 掘金前言: 從事Android開發(fā)的同學(xué)都知道移動(dòng)設(shè)備的內(nèi)存使用是非常敏感的話題,今天我們來(lái)看下如何使用軟引用與弱...

    TIGERB 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<