safe-point(safepoint 安全点) 和 safe-region(安全区域)「建议收藏」

safe-point(safepoint 安全点) 和 safe-region(安全区域)「建议收藏」safe-point(safepoint 安全点) 和 safe-region(安全区域)

大家好,又见面了,我是你们的朋友全栈君。

以 GC safe-point引入

GC如何找到不可用的对象

编写代码的时候是可以知道对象不可用的,但对于程序来说,需要一定的方式来知晓,可用方法比如:编译分析,引用计数,和对象是否可达

可达性分析

一个对象只要能够通过mutator触达,那么它就是“活”着的。如果Mutator栈的一个槽位包含了对象的引用,那么对象就是直接可触达。而从直接可达对象可触达的对象必定也是可达的,因而可达性分析,只需要找到直接可达的引用。

直接可达的引用就是根引用,根引用的集合就是根的集合

mutator的上下文就包含了直接可达的数据,所以要获取对象根集合就是要找到mutator上下文中的对象引用,而mutator的上下文指的就是它的栈、它的寄存器文件以及一些线程上特定的数据

全局数据本身也是直接可达的

可达性分析为了确保能正确的决定对象是否存活,GC需要获取mutator 上下文的一致性快照,然后枚举所有的根对象。

这里的一致性指的是 快照的抽取就像只在一个时间点发生,来避免丢失一些活着的对象

如何获取 mutator上下文的一致性快照

一种简单的方式就是在跟引用的过程中暂停所有的线程。当mutator暂停了它的执行时,只有将所有引用信息保存在其上下文中,才能枚举根的集合,这意味着,mutator需要能够告知那些栈的槽位有一用,那些寄存器持有引用。如果GC能够准确的获取上述引用信息,它就称作精准根集合枚举。

无法获取就是不精准的,以下只讲精准的

如何获取精准的引用信息枚举

对于java来说,JIT知晓所有的栈帧信息和寄存器的内容,当JIT编译一个方法时,对于每条指令,它都可以去保存根引用信息,保存意味着额外的存储空间,如果要存储所有的指令就显得花销太大,另外在真实的运行过程中也只有少数指令才会成为暂停点,因此JIT只需要保存这些指令点的信息就够了。而真正有机会成为暂停点的地方就称作 safe-points,即能够安全的枚举根集合的暂停点

safe-point 定义

“A point in program where the state of execution is known by the VM”,即代码中VM能够准确知道执行状态的位置。
safe-point有多个种类

  • GC safepoint,要触发一次GC,JVM中的所有线程都必须达到GC safepoint
  • Deoptimization safepoint,要触发一次 deoptimization,需要执行deoptimization的线程要到达safepoint之后才可以开始deoptimize

Hotspot中两者实现在一起,概念上没有直接联系,需要数据不一样

如何保证mutator会在 safe-point暂停

当GC想要触发一次回收时,它会设置一个标志,mutator则周期性的去检查(poll)这个标志,如果检查到了,就会立马暂停,这里的检查点(poll points)也是安全点,由JIT负责把poll points放到合适的位置

那些地方适合设置检查GC事件的标记

polling point插入的主要原则是:

  1. polling point应该足够多,防止GC等一个mutator的暂停太长,导致其他mutator都走在等GC释放空间,程序整个等待过长
  2. polling point不能太频繁导致运行时存储开销过大
  3. polling本身也是有开销的,不能过多

权衡下来只在必须和必要的地方加

  1. 在分配地址的时候强制添加,因为分配空间很有肯能导致回收,所以这里是一个安全点
  2. 长时间的执行一般意味着循环和方法调用,所以方法调用和循环返回最好加上

但是有时候并不是长时间的执行,而是长时间的空闲,比如 sleep、block,线程在执行其他的native函数,这些时候JVM无法掌控执行能力,也就无法响应GC事件。

不同的JVM选用不同的位置放置safepoint。

如何解决sleep/block 带来的问题

引用safe-region。safe-region是指代码快中没有用到会变异的部分,这样的代码块中,任何一个点都可以安全的枚举根。当进入到safe-region中时,mutator会设置一个准备标记,在离开safe-region区域之前,会检查GC是否已经完成了回收,如果没有,那么就暂停执行,如果有,就可以直接离开safe-region区域,不需要暂停mutator

文章翻译自 Xiao-Feng Li 博客

rednaxelafx对safepoint的回答

总结

代码的执行过程中,如果需要执行某些操作,比如GC,deoptimize,等等,必须知道当前程序所有线程运行到的地方,是否能够恰好满足我执行对应操作,而不会对应用程序本身造成损害,这些能够正确执行操作的地方也就是safepoint/saferegion

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107136.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2022激活码永久jar【2022免费激活】「建议收藏」

    (idea2022激活码永久jar)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月2日
    965
  • 图片外链方法大全: 免费的图床! 告别新浪图床 和 CDN

    图片外链方法大全: 免费的图床! 告别新浪图床 和 CDN今天给大家公开的是可以图片上传并获取稳定直链的方法,也就是俗称的”图床“;常用的一些免费图床,比如新浪图床可能不好用、图片访问慢;自费购买CDN价格过于昂贵,于是贫穷的我们整理出如下的方法上传图片,用于个人博客、网站等。本文仅列出可公开访问的网页,并只按正常用户操作,手动上传图片获取链接,不公开接口调用方法。防盗链可以通过网站的meta头激活成功教程,在head里插入下方代码:<metaname=”referrer”content=”never”>1、百度

    2022年6月20日
    85
  • git操作之pull拉取远程指定分支以及push推送到远程指定分支「建议收藏」

    git操作之pull拉取远程指定分支以及push推送到远程指定分支「建议收藏」一、pull操作1、将远程指定分支拉取到本地指定分支上:gitpull&lt;远程仓库名&gt;&lt;远程分支名&gt;:&lt;本地分支名&gt;2、将远程指定分支拉取到本地当前分支上:gitpull&lt;远程仓库名&gt;&lt;远程分支名&gt;3、将与本地当前分支同名的远程分支拉取到本地当前分支上gitpull&lt;远程仓库名&…

    2022年10月1日
    3
  • 如何安装wget_ubuntu安装unzip命令

    如何安装wget_ubuntu安装unzip命令今天给服务器安装新LNMP环境时,wget时提示-bash:wgetcommandnotfound,很明显没有安装wget软件包。一般linux最小化安装时,wget不会默认被安装。可以通过以下两种方法来安装:1、rpm安装rpm下载源地址:http://mirrors.163.com/centos/6.2/os/x86_64/Packages/下载wget的RPM包:htt…

    2022年10月17日
    7
  • 用matlab画一元二次函数图像_matlab绘制二元函数的三维图

    用matlab画一元二次函数图像_matlab绘制二元函数的三维图二元函数可以用mesh或者surf函数画图。下面举例说明:[X,Y]=meshgrid(-8:.5:8);Z=sqrt(X.^2+Y.^2);mesh(X,Y,Z)图像如下:觉得有帮助就采纳吧www.mh456.com防采集。^subplot221fimplicit3(@5261(x,y,z)x.^41022+y.^2-z)title(‘z=x^2+1653y^2’)subplot222…

    2025年9月24日
    5
  • Lerp 实现匀速运动「建议收藏」

    Lerp 实现匀速运动「建议收藏」Mathf.Lerp的常见误用是Update(){Transform.position=newVector3(transform.position.x,targetPosition,Time.deltaTime);}首先它是这样工作的:每帧都重新获取物体当前的位置,计算物体和目标距离的差距,再按照当前帧的持续时间(当做一个百分比)来移动这个比例的位置。因此整体运动是缓动的,先

    2025年8月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号