课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发语言,而今天我们就通过案例分析来了解一下,java编程HotSpot的算法实现都有哪些方法。
1、枚举根节点
可达性分析的一个就是枚举根节点,如果此时程序还在进行的话,根节点肯定一直变化,所以在枚举根节点这一步是需要停止程序运行的。枚举根节点并不是通过遍历所有执行上下文和全局的引用位置,虚拟机有办法直接得知哪些地方存放着对象引用。在HotSpot中,使用一组称为OopMap的数据结构来达到这个目的。GC只需要找到所有的OopMap就能获得所有的GCRoot对象。OopMap在什么时候生成呢?答案就是安全点。
2、安全点(SafePoint)
虚拟机只会在某些特定位置才会生成OopMap,这些位置称为安全点。安全点的选定是以“是否能让程序长时间执行的特征”为标准选定的。所以当程序运行到具有以下几个功能的指令时才会产生安全点:
方法调用
循环跳转
异常跳转等
有了安全点后,如何在GC发生时让所有线程都跑到近的安全点并停下来,两种方式:
抢先式中断:在GC发生时,将所有线程中断,如果某个线程中断的地方不在安全电上,让它继续执行,并“跑”到安全点。
主动式中断:当GC需要中断线程时,就简单地设置一个标志,每次线程到达安全点都检查一下这个标志,当标志为真时就主动中断挂起。
目前都是使用主动式中断。
3、安全区域(SafeRegion)
安全点解决了枚举根节点的问题,但是安全点需要线程都处于运行状态,假如有的线程处于sleep或者blocked的状态,无法去轮询GC设置的标志,虚拟机也不可能等待它们被唤醒重新进入运行状态之后再尝试GC。这时候就需要安全区域了。安全区域是指在一段代码片段中,引用关系不会发生改变。在线程执行到SafeRegion时,先标记自己已经进入了SafeRegion,那样,当这段时间里jvm要发起GC时,就不用管标识自己进入安全区域状态的线程。在线程要离开安全区域时,先检查系统是否已经完成了根节点枚举(或者是整个GC过程),如果完成了,线程继续,否则它必须等待直到收到可以安全离开安全区域的信号。
助力2021高薪就业,Java实战项目来袭!林森老师带你重温经典,从Java角度解析坦克大战游戏~教你用键盘监控事件控制坦克移动、子弹发射等!原价499元,限时9.9元购买,邀请好友学习还可获得现金红包!上不封顶~
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。