我正在编写我的第一个应用程序并试图了解如何使用MAT来查找潜在的内存泄漏。为简单起见,我编译了在Android Studio中启动新项目时提供的默认 Hello World 应用程序,即
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
美好而简单。现在,在我的平板电脑上启动此应用程序后,立即使用DDMS和hprof-conv
转换工具进行堆转储( heap-conv-1.hprof )。然后我将平板电脑旋转20次,以便活动经历多个生命周期,然后我再进行一次堆转储( heap-conv-2.hprof )。
我将两个堆转储文件加载到MAT中,比较它们并为.*MainActivity.*
执行正则表达式。结果是:
现在旋转后有MainActivity
的7个实例。由于我没有对这个应用程序做任何事情,我是否正确地认为这纯粹是因为那些实例还没有GC?在这种情况下,我是否正确地认为Android在方向更改后不会使用GC,并且仅在需要更多内存时?
答案 0 :(得分:1)
对于你的代码来说,它没有占用太多内存并且不会导致泄漏.. Application
在你将大量bitmaps
加载到内存或持有大量内存时需要大量内存of objects.and将Activity
上下文用于长寿命对象..
以下是谷歌开发者关于内存泄漏的优秀视频。Memory leaks
看完之后你就会知道所有的事情。