一、判断对象是否存活
1、引用计数法
2、可达性分析
就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可用的。
GC Root引用点:
a、JavaStack (栈桢中的本地变量表)中的引用的对象。
b、方法区中静态引用指向的对象。
c、方法区中常量引用指向的对象。
d、Native方法中JNI引用的对象
二、回收算法
1、复制(Copying)
2、标记-清除(Mark-Sweep)
3、标记-整理(Mark-Compact)
三、安全点(Safe Point)
程序只有在到达安全点时才能暂停。安全点的选定标准是“是否具有让程序长时间执行的特征”。“长时间执行”的最明显特征就是指令序列的复用,如方法调用、循环跳转等,具有这些功能的指令才会产生安全点。
让程序暂停的两种方式:
抢先式中断(Preemptive Suspension):在GC发生时,主动中断所有线程,不需要线程执行的代码主动配合。几乎不被采用。
主动式中断(Voluntary Suspension):设一个标志,各个线程主动去轮询这个标志,遇到中断则暂停。轮询地方与安全点重合。