1.监测泄漏的方法
什么事内存泄漏呢?
其实就是finish等结束操作,使用了,但是因为还是可达状态(就是没有完成),导致无法结束,这样这个对象就保持在那里,这样来回切换多次后,就会越来越多的对象,这就是内存泄漏。导致的结果是,对象多了,那肯定卡死
1.用android studio自带的工具Profiler检查内存是否泄漏:
记得GC哦,不GC的话Main2Activity还是会一直增加:步骤如下
2.Android Devices Monitor来监测内存泄漏
操作步骤如下,就可以查看到数据了
2.adb命令的,但是我不会
2.全部代码
1.MainActivity
package com.kunminx.memoryoptimization.leak;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.kunminx.memoryoptimization.R;
public class MainActivity extends AppCompatActivity {
//内存泄漏retained size
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_leak2);
}
public void change(View view) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
}
2.Main2Activity:
package com.kunminx.memoryoptimization.leak;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import com.kunminx.memoryoptimization.R;
import java.lang.ref.WeakReference;
//引用类型
public class Main2Activity extends AppCompatActivity {
//内存泄漏
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_eak);
}
private class TestThread extends Thread{
@Override
public void run() {
super.run();
while (true) {
try {
Thread.sleep(1000*60*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//private Handler handler=new Handler();
public void change(View view) {
TestThread testThread = new TestThread();
testThread.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
System.gc();
}
}
3.内存不泄漏情况
1.操作与数据:
- 操作:
执行进入,退出,进入,退出……(回到第一个开始的界面) - 操作前数据
- 操作后数据(Cause GC要多几次,而且要等一段时间,保证GC完成):
问题:
堆尺寸无明显变化:12.501----->12.577
4.内存泄漏情况
1.操作:
进入-点击按钮-退出-进入-点击按钮-退出……进入-点击按钮-退出。
2.操作前
3.操作后
问题:
很明显,Heap Size(堆尺寸变大了):12.501------->16.095
4.问题分析:
6.遇到的问题
1.打不开Android Device monitor
关闭android studio,再打开android device monitor