一、内存抖动介绍
定义:内存频繁分配和回收导致内存不稳定
表现:频繁 GC、内存曲线呈锯齿状
危害:导致卡顿、OOM
二、内存抖动导致OOM原因
- 频繁创建对象,导致内存不足及碎片(不连续)
- 不连续的内存片无法被分配,导致OOM
三、内存抖动解决实战
- 使用 Memory Profiler 初步排查
- 使用 Memory Profiler 或 CPU Profiler 结合代码排查
首先模拟内存抖动的实例,如下所示:
/**
* @desciption: 模拟内存抖动的界面
*/
public class MemoryShakeActivity extends AppCompatActivity implements View.OnClickListener {
@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[100000];
}
mHandler.sendEmptyMessageDelayed(0, 30);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_shake);
initView();
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
private void initView() {
AppCompatButton mBtnExecute = (AppCompatButton) findViewById(R.id.btn_execute);
mBtnExecute.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_execute) {
mHandler.sendEmptyMessage(0);
}
}
}
运行效果如下图:
![](https://img.haomeiwen.com/i2079881/e13b9f2db5b08f93.png)
在点击“执行任务”按钮之前的内存效果图如下:
![](https://img.haomeiwen.com/i2079881/7f5a5c9779cf3f5f.png)
从图中可以看出内存一直稳定在83.1MB。
在点击“执行任务”按钮之后内存效果图如下:
![](https://img.haomeiwen.com/i2079881/1658102f50e2747a.png)
从图中可以看到内存忽高忽低,呈锯齿状,这说明有内存抖动的现象。
查看导致内存抖动的代码位置
首先看下图所示:
![](https://img.haomeiwen.com/i2079881/f61053912c026a2b.png)
根据图中箭头指示可以找到内存抖动的位置,点击‘Jump to Source’ 即可跳转到发送内存抖动的代码位置。
内存抖动解决技巧
- 找循环或者频繁调用的地方
网友评论