内存抖动
定义:内存频繁分配和回收导致内存不稳定
表现:频繁GC,内存曲线呈锯齿状
危害:导致卡顿,OOM
内存抖动为什么会导致OOM?
(1)频繁创建对象,导致内存不足及碎片化(不连续)
(2)不连续的内存片无法被分配,导致OOM
// 代码模拟内存抖动
public class ShakeActivity extends AppCompatActivity {
@SuppressLint("HandlerLeak")
private static Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 创造内存抖动
for (int index = 0; index <= 100; index++){
String arg[] = new String[1000000];
}
mHandler.sendEmptyMessageDelayed(0,30);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shake);
Button button = (Button)findViewById(R.id.shake);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.sendEmptyMessage(0);
}
});
}
}
(1)使用Memory Profiler初步发现有内存抖动的现象。
如上如,发现有内存抖动的情况。
(2)用memory profiler 定位到具体是哪个哪个类(哪段代码)出现内存抖动
下图:
技巧:
(1)内存抖动一般发生在循环或者频繁调用的地方。