
图1
假设内存中对象之间的引用关系可以看成图1的方式,从图中可以看到 GC正是reference chain的起点。从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow
size总和。
相信了有以上的这些基础概念,我们应该对java内存管理有了一个初步的了解,下面回到主题。。。为什么会内存泄露呢,根本原因就是一个永远不会被使用的对象,因为一些引用没有断开,没有满足GC条件,导致不会被回收,这就造成了内存泄露。如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了,最终就是我们看到的OOM错误。虽然android的内存泄露做到了应用程序级别的泄露(android中的每个应用程序都是独立运行在单独进程中的,每个应用进程都由虚拟机指定了一个内存上限值,一旦内存占用值超过这个上限值,就会发生oom错误,进程被强制kill掉,kill掉的进程内存会被系统回收),但是对于一名测试工程师,我们需要对程序质量负责,绝对不能放过任何的内存泄露。
4、常见的MemoryLeak分析
4.1 频繁的使用static关键字修饰
4.2 BitMap隐患
4.2.1及时recycle
4.2.2设置一定的采样率
4.3 Cursor及时关闭
4.4 convertView缓存
4.5 组件都有生命周期,资源在对应的生命周期中销毁