深入理解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过程),如果完成了,那线程继续执行,否则它必须等待直到收到可以安全离开的信号为止。
可达性分析算法
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过程),如果完成了,那线程继续执行,否则它必须等待直到收到可以安全离开的信号为止。
相关文章推荐
- java算法小知识练习(二)
- Java常用类库
- Java常识之-注解
- myeclipse10的Mybatis插件 Generator最完整配置详解
- java IO复习(二)
- java学习心得
- 反射
- java内存
- moon jdk目录
- Java中堆内存与栈内存分配浅析
- 阿里一面准备工作<java部分>
- java学习笔记
- LeetCode : Longest Valid Parentheses [java]
- Java基础复习系列一
- Spring MVC 基于URL的映射规则(注解版)
- java代码实现猜数字游戏
- Spring基本概念和理论
- Java的静态块、模块、构造方法的执行顺序
- java多线程断点下载
- WebService对象可空的困惑,关于nillable和minOccurs soap java .net wsdl的区别