李锋镝的博客 - LiFengdi.Com

  • 首页
  • 时间轴
  • 留言
  • 左邻右舍
  • 我的日常
  • 关于我
青衿之志 履践致远
霁月光风 不萦于怀
  1. 首页
  2. 转载
  3. 技术
  4. 正文

JVM安全点介绍

2021年8月16日 8954点热度 0人点赞 0条评论
《深入理解java虚拟机》中说到GC Roots的节点主要在全局的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,但是进行根节点枚举的时候我们并不需要一个不漏地检查完所有执行上下文和全局引用位置,HotSpot中通过使用一组称为OopMap的数据结构,用于直接存放对象引用,类加载完成,HotSpot就会把对象内某个偏移位置是否为对象引用记录下来,JIT编译过程中,也会在特定的位置记录下栈和局存起中哪些位置是引用。

所以通过OopMap,jvm可以快速且准确地完成GC Roots枚举,但是导致引用发生变化的指令非常多,不可能为每一条指令都生成OopMaps,这也需要大量的额外空间。

于是jvm选择在某些”特定的位置“记录这些信息,这些位置就是“安全点”。程序只有执行到安全点的时候,才能够暂停。但是我们又不希望GC等待时间过长,因此为了防止程序因指令流原因而长时间等待,jvm选择方法调用、循环跳转、异常跳转等功能的指令才会产生安全点。

即安全点就是某些记录线程此时调用栈、寄存器等一些重要的数据区域里什么地方包含了GC要管理的指针(对象引用),而这些对象引用是通过OopMaps结构进行记录的,可以直接通过对OopMaps结构的访问来获得对象的引用。

安全点就是指代码中一些特定的位置,当线程运行到这些位置时它的状态是确定的,这样JVM就可以安全的进行一些操作,比如GC.
这些特定的位置主要有几下几种:

  1. 方法返回之前
  2. 调用某个方法之后
  3. 抛出异常的位置
  4. 循环的末尾

为什么把这些位置设置为jvm的安全点呢,主要目的就是避免程序长时间无法进入safepoint,比如JVM在做GC之前要等所有的应用线程进入到安全点后VM线程才能分派GC任务 ,如果有线程一直没有进入到安全点,就会导致GC时JVM停顿时间延长,比如R大之前回复的这个例子,这里面就是写了一个超大的循环导致线程一直没有进入到安全点,GC前停顿了8秒.

safepoint的使用场景

  1. 垃圾回收(这是最常见的场景)
  2. 取消偏向锁(JVM会使用偏向锁来优化锁的获取过程)
  3. Class重定义(比如常见的hotswap和instrumentation)
  4. Code Cache Flushing(JDK1.8在CodeCache满的情况下就可能出现)
  5. 线程堆栈转储(jstack命令)

既然这样,线程怎么知道什么时候要进入到saftpoint呢,一般有抢占式和主动式两种,常见的做法就是设置一个状态位,让所有线程去检查这个状态,当检测到saftpoint标志时就停下来。

除非注明,否则均为李锋镝的博客 - LiFengdi.Com原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/transport/3464
标签: JAVA JVM
最后更新:2021年8月16日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
0 评论
Inline Feedbacks
查看所有评论
文章目录
  • safepoint的使用场景
网站统计
  • 文章总数:264 篇
  • 评论总数:421 篇
  • 标签数量:218 个
  • 最后更新:2022年06月28日
  • 建站日期:2016年6月6

待到重阳日,还来就菊花。

最新 热点 随机
最新 热点 随机
MybatisCodeHelperPro激活 @Resource 和 @Autowired 的区别 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理 祝大家六一儿童节快乐~~~ 网易云什么时候能有杰伦的歌…… jsdelivr的CDN加速好像不行了……
居家办公了~办理居住证困难重重啊!WordPress的自动更新好烦啊醒醒~补个税了居住证签注...十一节后开工头一天,修了个耳机……
Docker打包部署示例 IDEA下载源码报:Cannot connect to the Maven process. Try again later. Redis中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 SpringBoot集成Redis,从Redis中获取数据为null,但实际上Redis中是存在对应的数据的,是什么原因导致的呢? BeanCopier工具类(性能优化工具类) CC知识共享协议各协议内容解释
最近评论
张三 发布于 1 个月前(05月20日) 收到,谢谢博主啊
张三 发布于 1 个月前(05月20日) 请问是哪些插件啊,我想用一下试试
zenmexiugai 发布于 1 个月前(05月20日) 改成一样的还是报错,怎么回事呢
张三 发布于 1 个月前(05月19日) 我不会css,作者的前端是怎么写的啊?包括这些评论啊什么的
张三 发布于 1 个月前(05月19日) 很棒的博客 作者加油啊
有情链接
  • 志文工作室
  • 临窗旋墨
  • 旧时繁华
  • 城南旧事
  • 强仔博客
  • 林三随笔
  • 徐艺扬的博客
  • 猫鼬的星球计划
  • 云辰博客
  • 韩小韩博客
  • 知向前端
  • 阿誉的博客
  • 林羽凡
  • 情侣头像
  • 哥斯拉
  • Xym's blog

COPYRIGHT © 2022 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备16004681号-2