垃圾回收的时候,首先须要判断对象是否存活,判断对象是否存活的时候,通常都是使用可达性分析,就是寻找引用链。若是在寻找从一个节点开始,逐个去寻找引用链,则会消耗不少时间,所以hotspot在寻找引用链的时候,过程(不敢保证是否就是正确的,只是本身看着周志明的书,本身理解的状况)以下:安全
- 因为程序不会任什么时候候都停下来GC(某些线程正在处理数据,则会产生脏数据),只有到达安全的地方才能中止下来GC,俗称安全点。
- 在安全点GC的时候,因为GC的时候,程序必须停顿掉全部其余正在执行的线程(stop the world), 停顿的时间长度取决于判断对象是否存活的时间,当判断对象是否存活的时候,采用可达性分析,去找到对象的引用链,若是从一个节点逐一寻找,时间消费太长。所以hotspot的作法是:当JIT(just in time compile即便编译器)编译的时候,经过对象内的偏移量算出引用类型,而后将这些引用类型记录在一个OopMap数据结构里,当须要寻找引用链的时候,直接扫描这个OopMap便可。
保证程序要GC的时候让全部线程处于安全点,有两个方案:数据结构
- 抢先试中断:让全部线程中,处于安全点的线程中止,处于非安全点的线程继续运行,直到到达安全点再中止。(几乎没人使用这种中断方式)
- 主动式中断:程序设置一个中断标志,各个线程在安全点的时候,去访问这个标志是否为真,是的话中止。