开发者社区> 问答> 正文

Global polling vs Thread Local handshake是怎样的?

Global polling vs Thread Local handshake是怎样的?

展开
收起
1358896759097293 2021-05-04 15:21:36 1214 0
1 条回答
写回答
取消 提交回答
  • 45271990@qq.com

    在jdk10它这里引入了一个叫thread the local的hand shake,这是一个新的协议品,主要的一个目的是要能够对一个特定的thread来触发safepoint,前面讲过触发safepoint以后是会让所有的线程都停下来,但对某些操作,也许只是对一个线程来做动作的话,做一个把整个 Java线程全部停下来的操作,是一个比较比较浪费的一个行为。 所以希望就是说能够用 thread local的机制,只对一个特定的thread来把它给暂停,在11里面,都是用thread local,这时候他取polling page的时候,都是从通过自己的thread里面去读一个polling page的地址。 实际上怎么做到thread local,其实上述的polling page中,做了两个页,一个就是好的每次都能读,另一个是坏的,读就肯定会失败,good page和bad page这样两个页,所以如果要对某个线程进行暂停的话,进入safepoint的话,其实就是把线程上的page的地址改写一下,改成坏页,这样 thread就会触发到异常来进入safepoint,这里有一个开关,叫User ThreadLocal Handshakes,它现在默认是打开的,基本上默认都会去走thread local的 safepoint,如果还是想用global pulling,可以把它关掉。 实际上用到thread local,用特定的线程来进入safepoint的这种win其实也没有多少,主要是现在的cgc大概会用到它。 Jit因为比较关注性能,如果那种loop在一个循环里面,每个loop的回编中都要去做一个 polling,虽然只是一两条指令,但如果是在一个大循环里面,加起来的性能其实还是会有影响的,所以hotstpot为了提高它的性能,可以把counted loop的polling给去掉,counted loop就是一般看到的for loop,可以认为是那种for的循环,因为这种循环中会有一个循环变量,循环变量有初始值,有它的边界,有它的布长,基本上都是固定的,在hotstpot里面,就会认为这种循环叫counted loop,在counted loop里面hotstpot可以做一个优化,把这种 polling的指令去掉,来提高它的性能,但这样会造成它的一个trade off,如果你的counted loop比较大,这样进safepoint的时间就会就会被推迟了。 因为在整个循环中都不会去检查polling,都不会去检查safepoint,要等这个循环执行完一直到最后退出的时候,才会检查,造成的一个可能负面影响,就是说对进safepoint的时间它会延迟掉。 像G1/ZGC一些新的GC,这些机器更关注的是说暂停的时间,为了要把暂停时间给减少,所以这些GC的时候,又会默认把 counted loop中的pulling给生成出来。 总的开关,就是UseCountedLoopSafepoints ,打开就会生成,关掉就不生成这些polling。

    2021-05-05 22:49:44
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
An Asynchronous Parameter Serv 立即下载
Glint:An Asynchronous Parameter Server for Spark 立即下载
Running Spark on a High-Perfor 立即下载