內(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ì)象。