前言
内存泄露系列文章
内存泄露系列文章(一) - 内存泄露原因及影响
内存泄露系列文章(二) - 内存泄露监测及分析
内存泄露系列文章(三) - 内存泄露解决方案
1. 概述
在c、c++中,只要你new开辟了内存,就一定要记得手动free释放,如果不及时的释放,那么越到后边就会发现内存越用越少,直至项目崩溃为止。c、c++可以申请比java大的内存空间,但是需要手动释放内存,而java不需要手动。
2. GC的垃圾回收问题
2.1:问题:
在java中:
1>:如果该对象没有被使用(即就是没有被引用),就会被回收;
2>:可以手动调用System.gc()回收,如果内存足够的时候,它并不会马上去回收,一旦当内存不足的时候,就肯定会触发System.gc()去回收;
3>:gc()是多线程,是一个异步的,调用它的时候,会停止正在运行的其他线程,在调用gc的时候界面会很卡,就是因为它在回收的时候会把其他线程都停掉,等回收完一个线程后再去执行另一个线程。很多时候界面卡顿,就是由于gc正在回收;
如果对同步和异步分不清楚的话,可以看下我这篇文章
同步和异步问题
4>:内存泄露往往就是对象后面不会用到了,但是另外某个对象还持有该对象的引用;
2.2:解决的套路:
一般就关心Activity、Service、View,主要关心这几个是否可以被回收:
1>:比如连续跳转多个Activity,就去关注Activity有没有被回收,如果Activity没有被回收,可能就是因为某个对象持有该Activity的引用,可能是单例持有Activity的引用,就是因为我们在单例中传递的是this,不要传递this,传递context.getApplicationContext();
2>:然后点击back返回键回退到MainActivity,按理来讲,应该就只有一个activity的实例了,如果你发现还有多个activity实例,代表activity还没有被回收;
这个平滑的,就表示正常的
如果上下来回波动,就代表程序有问题,叫做内存抖动