您的位置:首页 > 编程语言 > Java开发

深入理解Java 虚拟机(周志明)笔记(五)——垃圾收集器(二)

2016-03-10 22:27 579 查看
 5.1.2.HotSpot的算法实现

               可达性分析算法

                  1.枚举根节点(GC Roots)

                        问题:1.应用中的引用太多,如果逐个检查,会消耗很多时间

                             2.GC停顿消耗时间 GC停顿:可达性分析算法必须保证一致性,分析期间系统好像被冻结,即在分析过程中对象引用关系不能发生变化。————“Stop The World”

                        解决:1.准确式GC:虚拟机可以知道内存中的某个位置的数据具体是什么类型。

                                实现:使用OopMap的数据结构,在类加载完成时,把对象内什么偏移量上是什么类型的数据计算出来;在JIT编译过程中也会在特定的位置记录下栈和寄存器中哪些位置是引用。

                             2.安全点(Safepoint)和安全区域(Safe Region)

                                 安全点:1.Hotspot不需要为每条指令生成OopMap记录,Hotspot仅在特定位置记录,这些特定的位置成为安全点。

                                        2.安全点的选定以“程序是否具有让程序长时间执行的特征”为标准。单条指令的执行时间很短,长时间执行的特征是指令序列复用,例如方法调用、循环跳转、异常跳转等。

                                        3.HotSpot开始GC时要求所有线程必须在安全点位置。  

                                            实现:1.抢先式中断(现在几乎不使用)     

                                                        不需要线程主动配合,当GC发生时,将所有线程中断,若发现某线程中断位置不再安全点,就让线程继续执行到安全点。

                                                  2.主动式中断(主流)

                                                        当GC需要中断线程时,设置一个标志,各线程执行时在安全点时主动轮询这个标志,当发现中断标志为真就自己中断挂起

                                                        问题:当程序未执行(线程处于 Sleep或Block状态)时,线程无法响应JVM的中断请求,执行到安全点

                                                    解决: 安全区域(扩展的安全点):在一片代码段中,引用关系不会发生变化。

                                                        思想:当线程进入安全区域时,首先标识自己已经进入了安全区域,当这段时间发生GC时,就不用管表示自己为安全区域 状态的线程。当线程要离开安全区域时要先检查系统是否已完成根节点枚举(或者是整个GC过程),如果完成了,那线程继续执行,否则它必须等待直到收到可以安全离开的信号为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: