安全点:

作用:解决在枚举根节点时引用关系变化的问题

特征:是否具有让程序长时间执行的特征

条件:指令序列复用,如方法调用、循环跳转、异常跳转

什么是safepoint

safepoint可以用在不同地方,比如GC、Deoptimization,在HotspotVM中,GC safepoint比较常见,需要一个数据结构记录每个线程的调用栈、寄存器等一些重要的数据区域里什么地方包含了GC管理的指针。

从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停所有活动线程,但是该线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,然后才开始GC,该线程等待GC结束

 

又比如从偏向锁,升级为轻量级锁的时候,可以让持有锁的线程来到这儿暂停,然后把锁变换后再重新执行。

什么地方可以放safepoint

下面以Hotspot为例,简单的说明一下什么地方会放置safepoint

1、理论上,在解释器的每条字节码的边界都可以放一个safepoint,不过挂在safepoint的调试符号信息要占用内存空间,如果每条机器码后面都加safepoint的话,需要保存大量的运行时数据,所以要尽量少放置safepoint,在safepoint会生成polling代码询问VM是否要“进入safepoint”,polling操作也是有开销的,polling操作会在后续解释。

2、通过JIT编译的代码里,会在所有方法的返回之前,以及所有非counted loop的循环(无界循环)回跳之前放置一个safepoint,为了防止发生GC需要STW时,该线程一直不能暂停。另外,JIT编译器在生成机器码的同时会为每个safepoint生成一些“调试符号信息”,为GC生成的符号信息是OopMap,指出栈上和寄存器里哪里有GC管理的指针。

线程如何被挂起

如果触发GC动作,VM thread会在VMThread::loop()方法中调用SafepointSynchronize::begin()方法,最终使所有的线程都进入到safepoint。

线程有五种不同的状态对应五种挂起的措施

1、执行Java code

在执行字节码时会检查safepoint状态,因为在begin方法中会调用Interpreter::notice_safepoints()方法,通知解释器更新dispatchtable

2、执行native code

如果VM thread发现一个Java thread正在执行native code,并不会等待该Java thread阻塞,不过当该Java thread从native code返回时,必须检查safepoint状态,看是否需要进行阻塞。

3、执行compliedcode

如果想进入safepoint,则设置polling page不可读,当Java thread发现该内存页不可读时,最终会被阻塞挂起。在SafepointSynchronize::begin()方法中,通过os::make_polling_page_unreadable()方法设置pollingpage为不可读。

4、线程处于Block状态

即使线程已经满足了blockcondition,也要等到safepoint operation完成,如GC操作,才能返回。

5、线程正在转换状态

会去检查safepoint状态,如果需要阻塞,就把自己挂起。

安全点

1.安全点的选取 

在OppMaps的帮助下,虚拟机能够迅速的完成GCRoots的枚举,但是如果每一条指令都生成对应的OppMaps,那就需要大量的额外空间。

所以,程序在执行的时候并非在所有地方都能停顿下来gc,只有到达安全点才能停顿。安全点的选定是以“是否具有让程序长时间执行的特性”为标准,因为安全点过少的话gc停顿时间就会很长,安全点过多又会增加运行时负荷。”长时间执行“最明显的特征就是指令序列复用,如方法调用,循环跳转,异常跳转等。所有这些功能的指令才会产生安全点。 
 2.线程的停顿
 
 在gc发生时让所有线程跑到最近的安全点后停顿。
 两种思路:
第一种,抢先式中断,gc发生时,让所有线程中断,如果有线程不在安全点,那么让线程跑到安全点。
第二种,主动式中断,设置一个标识,各个线程执行时不断轮询这个标志,发现标志时就自动挂起,轮询标志的地方和安全点重合。


安全区域

安全点机制保证了程序执行的时候,在不太长的时间就会遇到可进入gc的安全点。但是如果线程处于sleep状态或者blocked状态的时候,这时线程无法响应jvm的中断请求,就需要安全区域。

安全区域是指在一段代码片段中,引用关系不会发生变化,在该区域的任何地方发生gc都是安全的。
当代码执行到安全区域时,首先标示自己已经进入了安全区域,那样如果在这段时间里jvm发起gc,就不用管标示自己在安全区域的那些线程了,在线程离开安全区域时,会检查系统是否正在执行gc,如果是那么就等到gc完成后再离开安全区域。

17.安全点与安全区相关推荐

  1. 那个学完这个小程序创业课程的小白现在月入17万

    摘要:在跟4000个创业者深入沟通之后,我发现了一个特别有趣的现象,越是什么都不懂的小白,反而越容易赚到钱. 被称为"风口制造者"."独角兽捕手"朱啸虎大胆放言 ...

  2. 2022年最新面试JVM面试追魂夺命17问,教科书级回答

    文章目录 前言 1.JVM的运行时数据区有哪些? 2.什么是堆内存?堆内存包含哪些部分? 3.什么是内存溢出? 4.什么是内存泄漏?与内存溢出有什么关系? 与内存溢出的关系! 5.你知道哪几种垃圾收集 ...

  3. pubg测试服服务器维护公告,绝地求生测试服12月17日更新 测试服维护公告

    绝地求生测试服12月17日更新 绝地求生测试服12月17日更新内容,绝地求生测试服将在12月17日9:00开始测试服的停机维护,大家知道本次测试服更新了什吗?下面小编就为大家带来了绝地求生测试服12月 ...

  4. 第17章 事件的预防和响应

    17.1 事件响应管理 任何安全方案都以预防事件发生作为一个主要目标. 但是一旦有事件发生,机构必须有能力做出响应,限制或遏制事件的发展. 事件响应的主要目标是将机构受到的影响降至最低限度. 17.1 ...

  5. 【CV】吴恩达机器学习课程笔记第17章

    本系列文章如果没有特殊说明,正文内容均解释的是文字上方的图片 机器学习 | Coursera 吴恩达机器学习系列课程_bilibili 目录 17 大规模机器学习 17-1 学习大数据集 17-2 随 ...

  6. 零起点学算法17——比较2个数大小

    零起点学算法17--比较2个数大小 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Description 输入2个整数, ...

  7. 北语计算机应用基础2,北语17春《计算机应用基础》练习2

    北语17春<计算机应用基础>练习2 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 2017秋北语17春<计算机应 ...

  8. 机器学习入门(17)— 输入 4 维数据、基于 im2col 展开来实现卷积层

    1. 输入 4 维数据 CNN 中各层间传递的数据是 4 维数据.所谓 4 维数据,比如数据的形状是(10, 1, 28, 28),则它对应 10 个高为 28.长为 28.通道为 1 的数据.用 P ...

  9. C语言程序设计 细节总结(第1-7章)

    C语言细节总结 温故而知新,许久没看C语言,发现了一些从前没注意的小细节,总结下来~ 第1章C语言及C程序概述 1.C语言有34种运算符.32个关键字.9种控制语句 第2章数据类型.运算符与表达式 2 ...

  10. qt 显示加速_新能源 | 吉利星越ePro上市 补贴后17.58万起售 加速更快油耗更低

    点击上方"蓝字"关注我们 新车速递 | 车市速报 吉利星越ePro上市 补贴后17.58万起 加速更快油耗更低 编辑 | 马   妍 排版 | 马   妍 「本文阅读时长约为3分钟 ...

最新文章

  1. 一步一图,带你重头梳理微服务架构!
  2. 微软推安全浏览器Gazelle,取代操作系统?
  3. 安装bigsur卡在12分钟_Big Sur为什么安装不了?macOS Big Sur无法完成安装的解决办法!...
  4. Server Too Busy
  5. 下位机和上位机是什么意思_单反无反选择高速机是什么意思?什么是高速机
  6. 数据层HikariCP与MyBatis整合
  7. python关键词提取源码_Python 结巴分词 关键词抽取分析
  8. TikZ绘图示例——尺规作图: 椭圆的近似画法
  9. python selenium 自动化 第四章-实用selenium+python实现web自动化测试第四节
  10. void类型指针 指针的各种组合
  11. android 时间函数 性能,Android 性能优化——启动时间优化
  12. C#中类的修饰符,this关键字和static关键字
  13. python grasshopper_Grasshopper操作shp
  14. 金蝶K3案例教程财务报表
  15. 人工客服——图灵机器人教程
  16. Arduino蜂鸣器唱曲天空之城
  17. 如何提升邮箱邮件安全性,邮箱管理制度有哪些?
  18. 【电脑操作】【鼠标】无线鼠标无反应怎么办?
  19. Kali Linux Web 渗透测试秘籍 第七章 高级利用
  20. RxJava过滤操作符

热门文章

  1. Java实现腾讯云短信发送
  2. 人这一辈子,渡你的只有两个人
  3. Qt编写自定义控件65-光晕日历
  4. 【JVM笔记】Parallel Scavenge回收器:吞吐量优先
  5. Python爬虫开发学习全教程第二版,爆肝十万字【建议收藏】
  6. Android 7.1 亮度调节之BrightnessController
  7. GEE实战 | 计算NDVI NDWI
  8. APP启动时间检测——u-apm
  9. matlab 三角函数 积化和差,三角函数之积化和差、和差化积及推导过程
  10. 三维地理信息平台介绍与比较