Android內(nèi)存抖動(dòng)——檢測(cè)、常見(jiàn)場(chǎng)景、處理

內(nèi)存抖動(dòng)

介紹:內(nèi)存抖動(dòng)是Android性能優(yōu)化中內(nèi)存優(yōu)化的一種情況,主要是由于頻繁的對(duì)象創(chuàng)建導(dǎo)致內(nèi)存抖動(dòng),最終可能導(dǎo)致卡頓和OOM。

檢測(cè)

demo:點(diǎn)擊一次button,將會(huì)創(chuàng)建100000個(gè)對(duì)象,不斷創(chuàng)建、GC回收(因?yàn)樽址唇右獎(jiǎng)?chuàng)建StringBuilder對(duì)象)

Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = "";
                for(int i=0; i< 100000; i++) {
                    str += i;
                }
            }
        });

利用Android Profiler進(jìn)行檢測(cè):

Record截取一段時(shí)間進(jìn)行分析:


可以看到創(chuàng)建了大量的StringBuilder對(duì)象,也就是在大循環(huán)中頻繁創(chuàng)建對(duì)象,GC回收頻繁,導(dǎo)致內(nèi)存抖動(dòng)。

總結(jié):內(nèi)存抖動(dòng)可采用Android Profiler進(jìn)行檢測(cè),可截取某段時(shí)間進(jìn)行對(duì)象分析,查看哪些對(duì)象被頻繁創(chuàng)建。

內(nèi)存抖動(dòng)常見(jiàn)場(chǎng)景

大循環(huán)中創(chuàng)建對(duì)象、自定義View的onDraw()方法中創(chuàng)建對(duì)象(屏幕繪制與動(dòng)畫執(zhí)行時(shí)會(huì)頻繁調(diào)用onDraw())。

處理方法

將對(duì)象創(chuàng)建放到循環(huán)外,對(duì)于無(wú)法避免的創(chuàng)建對(duì)象情況,可采用對(duì)象池模型進(jìn)行緩存,復(fù)用對(duì)象,需注意用完后要手動(dòng)釋放對(duì)象池中對(duì)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容