safePoint 讲解及其安插思路分析
checkPoint:先讲解 safePoint,对于 ART 编译的代码,可以定期轮询当前 Runtime 来确认是否需要执行某些特定代码;可以认为这些轮询时的点,就是 safepoint;safepoint 可以用来实现暂定一个 java 线程,也可以用来实现 Checkpoint 机制;例:当正在执行 java 代码的线程 A 执行到 safepoint 时,会执行 CheckSuspend 函数,在发现当前线程有 checkpoint request 时,
会在这个点执行线程的 CheckPoint 函数;如果发现当前线程有 suspend request 时,会进行 SuspendCheck,使得线程进入 Suspend 状态(暂停);
所以说,ART CheckPoint 应该是 safepoint 的一个功能实现;
safePoint 讲解链接:
作者:RednaxelaFX 链接:https://www.zhihu.com/question/48996839/answer/113801448来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
从编译器和解释器的角度看,ART 的 safepoint 有两种:
主动 safepoint:编译生成的代码里或者解释代码里有主动检查 safepoint 的动作,并在发现需要进入 safepoint 时跳转到相应的处理程序里。ART 的解释器安插主动 safepoint 的位置在循环的回跳处(backedge,具体来说是在跳转前的源头处)以及方法返回处(return / throw exception)。ART Optimizing Compiler 安插主动 safepoint 的位置在循环回跳处(backedge,具体来说是在跳转前的源头处)以及方法入口处(entry)。被动 safepoint:所有未内联的方法调用点(call site)都是被动 safepoint。这里并没有任何需要主动执行的代码,而就是个普通的方法调用。之所以要作为 safepoint,是因为执行到方法调用点之后,控制就交给了被调用的方法,而被调用的方法可能会进入 safepoint,safepoint 中可能需要遍历栈帧,因此 caller 也必须处于 safepoint。
安插 safepoint 的位置的思路是:程序要能够在 runtime 发出需要 safepoint 的请求后,及时地执行到最近的 safepoint 然后把控制权交给 runtime。怎样算“及时”?只要执行时间是有上限(bounded)就可以了,实时性要求并不是很高。于是进一步假设,向前执行(直线型、带条件分支都算)的代码都会在有限时间内执行完,所以可以不用管;而可能导致长时间执行的代码,要么是循环,要么是方法调用,所以只要在这两种地方插入 safepoint 就可以保证及时性了。至于具体在方法入口还是出口、循环回边的源头还是目标处插入 safepoint,这是个具体实现的细节,只要选择一边插入就可以了。
版权声明: 本文为 InfoQ 作者【北洋】的原创文章。
原文链接:【http://xie.infoq.cn/article/3559d2413e427d20822eceae9】。文章转载请联系作者。
评论