当前位置:网站首页>safe-point(safepoint 安全点) 和 safe-region(安全区域)「建议收藏」
safe-point(safepoint 安全点) 和 safe-region(安全区域)「建议收藏」
2022-08-04 09:45:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
以 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插入的主要原则是:
- polling point应该足够多,防止GC等一个mutator的暂停太长,导致其他mutator都走在等GC释放空间,程序整个等待过长
- polling point不能太频繁导致运行时存储开销过大
- polling本身也是有开销的,不能过多
权衡下来只在必须和必要的地方加
- 在分配地址的时候强制添加,因为分配空间很有肯能导致回收,所以这里是一个安全点
- 长时间的执行一般意味着循环和方法调用,所以方法调用和循环返回最好加上
但是有时候并不是长时间的执行,而是长时间的空闲,比如 sleep、block,线程在执行其他的native函数,这些时候JVM无法掌控执行能力,也就无法响应GC事件。
不同的JVM选用不同的位置放置safepoint。
如何解决sleep/block 带来的问题
引用safe-region。safe-region是指代码快中没有用到会变异的部分,这样的代码块中,任何一个点都可以安全的枚举根。当进入到safe-region中时,mutator会设置一个准备标记,在离开safe-region区域之前,会检查GC是否已经完成了回收,如果没有,那么就暂停执行,如果有,就可以直接离开safe-region区域,不需要暂停mutator
总结
代码的执行过程中,如果需要执行某些操作,比如GC,deoptimize,等等,必须知道当前程序所有线程运行到的地方,是否能够恰好满足我执行对应操作,而不会对应用程序本身造成损害,这些能够正确执行操作的地方也就是safepoint/saferegion
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/107136.html原文链接:https://javaforall.cn
边栏推荐
- Ansible deployment scripts - pro available without pit
- Redis 内存满了怎么办?这样置才正确!
- 数据万象内容审核 — 共建安全互联网,专项开展“清朗”直播整治行动
- Win10电脑经常发出叮咚声音怎么关闭
- Detailed explanation of telnet remote login aaa mode [Huawei eNSP]
- leetcode每天5题-Day06
- 2022 Cloud Native Computing代表厂商 | 灵雀云第三次入选Gartner中国ICT技术成熟度曲线报告
- 字符串与正则表达式(C#)
- MySQL binlog都有哪些模式?
- 密码字典生成工具pydictor/john
猜你喜欢

MindSpore:【AIR模型导出】导出时提示源码中select_op参数类型转换失败

张朝阳对话俞敏洪:谈宇宙、谈焦虑、谈创业、谈退休、谈人生

Win7C盘不能扩大怎么办?Win7C盘扩展卷不能点怎么解决

LeetCode中等题之旋转图像

Redis 内存满了怎么办?这样置才正确!
![Layer 3 Switch/Router OSPF Configuration Details [Huawei eNSP Experiment]](/img/28/1a7ad13a15287a4cb84aabf39202a4.png)
Layer 3 Switch/Router OSPF Configuration Details [Huawei eNSP Experiment]

TiCDC同步延迟问题处理

MindSpore:Ascend运行出现问题
![[Punctuality Atomic STM32 Serial] Chapter 1 Learning Method of the Book Excerpted from [Punctuality Atomic] MiniPro STM32H750 Development Guide_V1.1](/img/99/23e3dcb426769a415e33f7ff51bbb8.png)
[Punctuality Atomic STM32 Serial] Chapter 1 Learning Method of the Book Excerpted from [Punctuality Atomic] MiniPro STM32H750 Development Guide_V1.1

OAK-FFC-4P全网首次测试
随机推荐
【C补充】指向指针或函数的指针
cannot import name ‘import_string‘ from ‘werkzeug‘【bug解决】
【C补充】指针相关知识点收集01
leetcode二叉树系列(一)
Libtomcrypt AES 加密及解密
【cookie 临时存储数据,WebStorage ,sessionStorage】
v-model原理,在“radio”、“checkbox”、“select”、修饰符
94后字节P7晒出工资单:狠补了这个,真不错...
LVS-DR集群部署
How Oracle for current library or certain library data on the same server number?
Detailed Explanation of Addresses Delivered by DHCP on Routing/Layer 3 Switches [Huawei eNSP]
我和 TiDB 的故事 | 缘份在,那就终是能相遇的
开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握
冰蝎逆向初探
函数防抖与函数节流
XCTF-reverse-signin
JDBC知识点
leetcode动态规划系列(求路径篇)
他97年的,我既然卷不过他...
MindSpore:model.train中的dataset_sink_mode该如何理解?