李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 转载
  3. 技术
  4. 正文

JVM安全点介绍

2021年8月16日 约 868 字3 分钟 123 0 0
本文最后更新于 2021年8月16日,距今已 1856 天,其中的信息可能已经发生变化,请注意甄别。
《深入理解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标志时就停下来。

参考链接

1
  1. 1例子hllvm.group.iteye.com
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/transport/3464

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

JVM安全点介绍

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA JVM
最后更新:2021年8月16日
相关文章
  • 重构 Controller 终极指南:从臃肿到优雅的 7 大黄金法则 + 实战技巧2025年10月31日
  • 查看占用 CPU 最高的线程(Java)2021年5月27日
  • JAVA简单快速的读写Excel之EasyExcel2019年10月25日
  • OOM后,JVM一定会退出吗?为什么?2024年4月15日
  • 了解一下Spring中用了哪些设计模式2019年10月20日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复

文章评论

还没有评论,快来抢沙发吧~

惟坚韧者始能遂其志。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
支撑全网40%网站的WordPress正在重新拥抱PHP生态 Kratos-plus v1.1.24版本更新说明 关于主题加载速度优化的一点儿小演进 市场主流AI编程大模型横向深度分析(2026-09-11) 一款节省token的利器:RTK(Rust Token Killer) RAG太难学?LLM Wiki了解一下
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?推荐一个SVG 矢量小图标免费下载网站
Springboot接入DeepSeek API 详解 ZooKeeper 数据持久化 重构 Controller 终极指南:从臃肿到优雅的 7 大黄金法则 + 实战技巧 UUID太长怎么办?快来试试NanoId 写了个日期进度条的小插件 JMX监控权限认证配置
最近评论
blank
lijie blog 发布于 9 小时前(09月14日) 友链申请 名称:lijie blog 链接:https://lijie.cool 描述:懒于当...
blank
Hary 发布于 11 小时前(09月14日) 等PHP9推倒重来,出个船新版本
blank
李锋镝 发布于 23 小时前(09月14日) 不愧是皮总,这措辞~ :30:
blank
皮皮社长 发布于 23 小时前(09月14日) :20: 我勒了个去,中国汉字波大精深。 :42:
blank
李锋镝 发布于 23 小时前(09月14日) 我这里面也带了一堆小表情包,看看不行也优化一波
标签聚合
Redis WordPress AI SpringBoot Claude 架构 JAVA 分布式 AI编程 K8s ElasticSearch Spring 多线程 日常 IDEA MySQL MQ JVM SQL 数据库
友情链接
  • 若梦博客
  • 九仞之行
  • sssr7844的博客
  • Honesty
  • 彬红茶日记
  • 蜗牛工作室
  • 老张博客
  • 搬砖日记
  • 瓦匠个人小站
  • 志文工作室
  • 韩情脉脉
  • 知向前端
  • Serendipity
  • 临窗旋墨
  • 韩小韩博客
  • 皮皮社
  • 哥斯拉
  • Mr.Sun的博客
  • 懋和道人
  • 林羽凡

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号