Android 内存抖动介绍及实例演示

一、内存抖动介绍

定义:内存频繁分配和回收导致内存不稳定
表现:频繁 GC、内存曲线呈锯齿状
危害:导致卡顿、OOM

二、内存抖动导致OOM原因

  1. 频繁创建对象,导致内存不足及碎片(不连续)
  2. 不连续的内存片无法被分配,导致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);
        }
    }
}

运行效果如下图:

Android 内存抖动介绍及实例演示_第1张图片

在点击“执行任务”按钮之前的内存效果图如下:

Android 内存抖动介绍及实例演示_第2张图片

从图中可以看出内存一直稳定在83.1MB。

在点击“执行任务”按钮之后内存效果图如下:

Android 内存抖动介绍及实例演示_第3张图片

从图中可以看到内存忽高忽低,呈锯齿状,这说明有内存抖动的现象。

查看导致内存抖动的代码位置

首先看下图所示:

Android 内存抖动介绍及实例演示_第4张图片

根据图中箭头指示可以找到内存抖动的位置,点击‘Jump to Source’ 即可跳转到发送内存抖动的代码位置。

内存抖动解决技巧

  • 找循环或者频繁调用的地方

Android 内存泄漏介绍及实例演示

你可能感兴趣的:(Android 内存抖动介绍及实例演示)