1.表示强制垃圾回收器进行回收
2.用户捕获转存按钮
3.第三个按钮我这边没有,我也不是很清楚
4.用于增大和缩小时间轴的按钮,也就是按多少秒进行内存分析
5.用于跳转至实时内存数据的按钮
6.时间线,实现activity的状态,用户输入的Event事件
7.内存使用量时间线
内存是如何进行计算,内存计算中类别所示如下:
Java:从java或者Kotlin 分配的对象内存
Native:C 或者C++ 分配的内存对象
Graphic:图像缓冲区向屏幕显示像素所占内存
Stack:栈内存,一般与你的程序开启多少线程有关
Code:你的代码占用的内存,比如 .dex 或者 .so 或者 .class 文件占用的内存
下面举个简单的例子分析内存泄漏:
代码如下
public class MemoryActivity extends AppCompatActivity {
private LinearLayout llContainer;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory);
llContainer = findViewById(R.id.llContainer);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handler.sendEmptyMessageDelayed(0,100000);
}
});
}
如果在退出Activity之前没有清空Handler消息,就会造成Handler持有Activity导致Activity不能被回收
具体分析如下:
因为ActivityThread,中持有Looper–>mQueue–>message–>message.target–>handler–>Activity 导致Activity不能被释放