内存分析

准备工作

产品功能

1 添加自定义维度数据(可选)

内存分析SDK提供了一系列设置键/值对的API,方便给内存分析日志添加更多额外信息,请根据需要使用。

import com.aliyun.emas.apm.mem.monitor.ApmMemMonitor

ApmMemMonitor.getInstance().setCustomKey(key, value)
import com.aliyun.emas.apm.mem.monitor.ApmMemMonitor;

ApmMemMonitor.getInstance().setCustomKey(key, value);

详细API请查看添加自定义维度

2 主动触发内存分析(可选)

内存分析SDK内部有一些策略去判断触发内存分析的时机,如果您需要根据自身的业务特性去主动触发内存分析,可以调用触发内存分析的API。

重要

每次App生命周期内,最多仅会触发一次内存分析,如果一次生命周期内已经触发过内存分析,调用主动触发内存分析API也不会真正的去做内存分析。

import com.aliyun.emas.apm.mem.monitor.ApmMemMonitor

ApmMemMonitor.getInstance().triggerMemAnalysis()
import com.aliyun.emas.apm.mem.monitor.ApmMemMonitor;

ApmMemMonitor.getInstance().triggerMemAnalysis();

功能验证

1 接入验证

过滤tag:Apm-MemMonitor,查看内存分析是否初始化,下面列出关键日志。

 I  Initializing MemMonitor blocked main for 3 ms

2 构造内存泄漏场景

class LeakActivity: AppCompatActivity () {
    
    companion object {
        var activity: Activity? = null
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity = this
        finish()
    }
}
public class LeakActivity extends AppCompatActivity {
    static Activity activity;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = this;

        finish();
    }
}
说明

请注意需要在您的AndroidManifest.xml里注册LeakActivity。

3 主动触发内存分析

内存分析SDK内部有一些策略去判断触发内存分析的时机,为了快速验证功能,可以主动触发内存分析。

import com.aliyun.emas.apm.mem.monitor.ApmMemMonitor

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val memButton = Button(this)
    memButton.setText("Test memory analysis")
    memButton.setOnClickListener(object : View.OnClickListener {
        override fun onClick(view: View?) {
            //触发内存分析
            ApmMemMonitor.getInstance().triggerMemAnalysis()
        }
    })

    addContentView(
        memButton, ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
        )
    )
}
import com.aliyun.emas.apm.mem.monitor.ApmMemMonitor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    Button memButton = new Button(this);
    memButton.setText("Test memory analysis");
    memButton.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
           //触发内存分析
           ApmMemMonitor.getInstance().triggerMemAnalysis(); 
       }
    });
    
    addContentView(memButton, new ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT,
           ViewGroup.LayoutParams.WRAP_CONTENT));
}

4 查看日志

过滤tag:Apm tag:Apm-MemMonitor,查看内存分析是否初始化,下面列出关键日志。

  # 成功触发内存分析
  I  track mem problem, reason=manual trigger mem analysis
  # 开始内存分析
  D  start analysis heap for session=7d08b9cc14054faaaef8f7f81f03122b
  I  heap analyze step: Extracting metadata
  I  heap analyze step: Finding retained objects
  I  heap analyze step: Finding paths to retained objects
  I  heap analyze step: Finding dominators
  I  heap analyze step: Inspecting objects
  I  heap analyze step: Computing native retained size
  I  heap analyze step: Computing retained size
  I  heap analyze step: Building leak traces
  # 分析结果
  D  find 1 leaks
  D  find 0 large objects
  # 上报结果
  D  report data success. eventId=mem_leak, sessionId=7d08b9cc14054faaaef8f7f81f03122b

5 控制台查看数据image