线程私有数据不需要考虑,会随着线程结束而结束,垃圾收集器关注的是堆和方法区中动态创建对象
1、可达性分析
通过一组GC Root为起点向下探索,探索的路径为引用连,最终根据引用连是否可达判断是否可以被回收
GC Root对象
1.1 虚拟机栈局部变量表中引用的对象
1.2 方法区中静态引用指向的对象
1.3 仍处于存活状态中的线程对象
1.4 Native方法中JNI引用的对象
2、什么时候会回收
2.1 Allocation Failure 堆内存分配时剩余空间不足
2.2 System.gc(); 会出发垃圾回收
3、如何回收垃圾
各个厂商回收算法不同
遍历标记算法 、复制算法、复制压缩算法各有优缺点
从GC Root集合开始遍历一次 未引用的对象会被回收
过程分为标记阶段和清除阶段
4、JVM分代回收策略
新生代、老生代(HotSpot 还有永久代)
新创建的对象在新生代,新生代多次回收仍然存活就会被分到老年代
5、引用
由强到弱分为 强引用 (new Obj())、软引用(SoftReference<Obj>)、弱引用<WeakReference<Obj>>、虚引用(用不到)
android项目中用到图片(Bitmap)处理时会用到软引用
软引用自身是强引用 引用的对象是软引用