JVM----垃圾收集器
1.根搜索算法
1.可达性分析算法
该算法是用来判断一些对象是否存活的,这个算法的起点就是图中的GC Root,,从根开始往下搜索,搜索走过的路径称之为“引用链”,如果一个对象到根节点没有任何一条引用链的话,就说明这个对象是要被回收的。
如图,Object5、Object6、Object7虽然他们互相关联,但是他们与根节点之间没有任务一条引用链,所以都是不可用对象!!
目前java中可作为GC Root的对象有:
1、 虚拟机栈中引用的对象(本地变量表)
2、 方法区中静态属性引用的对象
3、 方法区中常量引用的对象
4、 本地方法栈中引用的对象(Native对象)
2.枚举根节点
现在的很多应用都是十分巨大的,每次从根节点开始往下搜索引用,都是耗时十分庞大的工作!另外可达性分析对执行时间的敏感还体现在GC停顿上,每次要GC时,都会进行一次Stop The World,因为这样可以防止在GC Root进行搜索时有些引用还存在变化而导致的数据有误差。
在STW后,我们就要开始进行根节点枚举了,但是我们真的需要去一个不漏的检查完所有的执行上下文和全局的引用位置吗,不,并不要!就跟我们翻字典一样,我们找一个单词,我们需要从字典第一页开始翻到最后一页??那还不得累死啊,虚拟机也是这样认为的,太累了,所以虚拟机希望可以通过一种记录表,在枚举时可以快速查找到被引用的对象,这样工作效率会大大提升。于是OopMap的数据结构出现了,在类加载完后,对象内什么偏移量上是什么类型的数据都会记录在OopMap里。这样的话在根节点枚举时就可以得到这些信息了。
3.安全点
在OopMap的帮助下,虚拟机可以快速的完成根节点的枚举。从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停暂停所以活动线程,但是线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,等待GC结束。