5、HotSpot的算法实现
来源:互联网 发布:手机淘宝如何重新登录 编辑:程序博客网 时间:2024/06/11 20:54
前面了解关于对象的生死判定和垃圾收集算法,而在HotSpot中是怎么实现的呢?
枚举根结点
根据可达性分析算法,GC的时候从GC Roots节点开始找引用链的,而做为GC Roots的节点主要是在全局性引用与执行上下文中,如果逐个检查的话,必然是需要耗费很多时间的。
而执行GC的时候,所有线程是必然要停顿的。因为在执行时,如果对象的引用关系还在不断变化,就无法准确的进行GC了。
不过,主流的虚拟机现在都是采用精确式GC,即执行系统停顿后,并不需要检查全部执行上下文和全局引用位置,而是通过某些方法知道哪些地方存放着对象引用。
在HotSpot中是使用一组称为OopMap的数据结构来达到这个目的的。
安全点
在HotSpot中,特定的位置会使用OopMap来记录信息,这个位置被称为“安全点”。程序执行时到达安全点才能停下来。
安全点的选定是以程序“是否具有让程序长时间执行的特征”为标准选定的————因为每条指令执行时间很短,而长时间执行的最明显特征就是指令序列重复,如方法调用、循环跳转、异常跳转等,所以适合产生安全点。
那么在GC发生时,是如何让线程达到安全点再停顿下来呢。主要有两种方案:抢断式中断和主动式中断。
1、抢断式中断
在GC发生时,中断所有线程,如果有线程不在安全点的话就恢复线程,让它到安全点再中断。(这种方式几乎被弃用了)
2、主动式中断
当GC时,简单设置一个标志,各个线程主动去轮询这个标志,标志为真时就自己中断挂起。
安全区域
安全区域是指一段代码片段中,引用关系不发生变化。在这个区域中任何地方GC都是安全的。
如果程序在执行的话,安全点就足以解决了GC问题。但是如果程序没有在运行呢,没在运行也就是说没有分配CPU时间,比如线程处于Sleep或者Blocked状态,这时候就无法响应JVM的中断请求了,这时候就需要用安全区域来处理了。
在线程执行到这个区域时,会先标识自己是安全区域(Safe Region)。当JVM在这段时间内发生GC时,就不用管标识自己为安全区域的线程了。线程离开安全区域时,要检查系统是否完成GC的整个过程(根节点枚举),完成的话就继续执行线程,否则必须等待,直到收到可以安全离开安全区域的信号。
- 5、HotSpot的算法实现
- HotSpot的算法实现
- HotSpot的算法实现
- HotSpot的算法实现
- java虚拟机HotSpot 的 GC 算法实现
- java虚拟机-HotSpot的算法实现
- HotSpot的垃圾收集算法实现
- HotSpot的垃圾回收算法实现
- HotSpot算法实现
- 3.4 HotSpot算法实现
- HotSpot算法实现
- 虚拟机3.4 HotSpot算法实现
- 【深入理解Java虚拟机】------ 学习0304 HotSpot的算法实现
- 6.《深入理解Java虚拟机》HotSpot 的算法实现
- JVM系列六(HotSpot的算法实现)
- 《JVM学习系列》四.垃圾收集算法及HotSpot的算法实现
- JVM/HotSpot-Java对象头的HotSpot实现分析
- [深入理解Java虚拟机]第三章 HotSpot的垃圾收集算法实现
- 驱动程序直接编译进内核
- A. 拼音魔法 大学生程序设计邀请赛(华东师范大学)
- 刷清橙OJ--A1014.进制转换5
- 适配器模式
- 人见人爱A^B
- 5、HotSpot的算法实现
- 标签中onclick绑定函数却is not defined的原因
- 斗地主-比较牌大小算法
- 自定义dialog
- 动态内存管理:模拟实现memcpy,memmove
- 杨辉三角
- CodeForces 5891 Lottery
- 在freecodecamp练习的算法题心得记录
- HDOJ 1914 The Stable Marriage Problem