JVM常用概念之安全点

1.什么是安全点?

  • 安全点是执行线程状态被充分描述的执行范围。安全点是常见的 JVM 实现细节;
  • 在安全点处,mutator线程处于与堆交互的已知且定义明确的点。这意味着堆栈上的所有引用都已映射(在已知位置),并且 JVM 可以对所有引用进行解释。只要线程保持在安全点处,我们就可以安全地操作堆 + 堆栈,这样当线程离开安全点时,它对世界的视图就保持一致。
  • 目前所有的 JVM 都对全局安全点有一定的要求
  • 如果Java 线程被锁或同步块阻塞、在监视器上等待、处于暂停状态或被阻塞 IO 阻塞,则该线程处于安全点。本质上,这些都符合 Java 线程有序取消调度的条件,并且是线程被置于安全点之前的整理工作的一部分。
  • Java 线程在执行 JNI 代码时处于安全点。在跨越本机调用边界之前,堆栈在移交给本机代码之前处于一致状态。这意味着线程在处于安全点时仍可以运行。
  • 正在执行字节码的 Java 线程不在安全点(或者至少 JVM 不能假定它处于安全点)。
  • 如果 Java 线程在非安全点处被操作系统中断,则在取消调度之前不会将其带到安全点。
  • JVM 和正在运行的 Java 线程在安全点方面具有以下关系:
    • JVM 无法强制任何线程进入安全点状态。
    • JVM 可以阻止线程离开安全点状态。

那么 JVM 如何让所有线程进入安全点状态?问题在于将线程暂停在已知状态,而不仅仅是中断它。为了实现此目标,如果观察到“安全点标志”,JVM 会让 Java 线程在方便的位置自行暂停。

2.将 Java 线程置于安全点

Java 线程以“合理”间隔轮询“安全点标志”(全局或线程级别),并在观察到“转到安全点”标志时转换为安全点状态(线程在安全点被阻止)。这很简单,但由于我们不想花费所有时间来检查是否需要停止 C1/C2 编译器(-client/-server JIT 编译器),因此尝试将安全点轮询保持在最低限度。除了标志检查本身的成本之外,维护“已知状态”还会大大增加某些优化的实施复杂性,因此将安全点保持得更远可以为优化开辟更广泛的空间。这些考虑因素结合起来导致安全点轮询的以下位置:

  • 在解释器中运行时,任意 2 个字节码之间(有效)
  • 在 C1/C2 编译代码中的“非计数”循环回溯边缘上
  • C1/C2 编译代码中的方法入口/出口(Zing 的入口,OpenJDK 的出口)。请注意,当方法被内联时,编译器将删除这些安全点轮询。

如果您是那种为了有趣(或为了利益,或两者兼而有之)而研究汇编的人,您可以通过查找以下内容在 -XX:+PrintAssembly 输出中找到安全点轮询:

OpenJDK 上的“{poll}”或“ {poll return}”

更具体的解释是:

  1. 线程可以处于安全点,也可以不处于安全点。处于安全点时,线程的 Java 机器状态表示描述得很好,并且可以被 JVM 中的其他线程安全地操作和观察。不处于安全点时,线程的 Java 机器状态表示将不会被 JVM 中的其他线程操作。[请注意,其他线程不会操作线程的实际逻辑机器状态,只是操作该状态的表示。更改机器状态表示的一个简单示例是更改 Java 引用堆栈变量由于重新定位该对象而指向的虚拟地址。引用变量的逻辑状态不受此更改的影响,因为引用仍然引用同一个对象,并且即使两个引用变量暂时指向不同的虚拟地址,它们在逻辑上仍然相等]。

  2. “处于安全点”并不意味着“被阻塞”(例如 JNI 代码在安全点运行),但“被阻塞”总是在安全点发生。

  3. JVM 可以选择达到全局安全点(又称为 Stop-The-World),其中所有线程都处于安全点,并且不能离开安全点,除非 JVM 决定允许它们离开。这对于执行需要所有线程处于良好描述状态的各种工作(如某些 GC 操作、类加载期间的去优化等)非常有用。

  4. 一些 JVM 可以将单个线程带到安全点,而无需全局安全点。例如,Zing 使用术语 Checkpoint(首次发表于 [1])来描述一种 JVM 机制,该机制将线程单独传递到线程特定的安全点,以在单个线程状态下执行某些非常短的操作,而无需 Stop-The-Wolrd 暂停。

  5. 当你编写不安全的 Java 代码时,你必须假设安全点可能出现在任意两个字节码之间。

  6. 不安全调用不需要在其中包含安全点(而且许多/大多数都没有),但它们可以包含一个或多个安全点。例如,不安全的 memoryCopy 可以包含定期的安全点机会(例如每 16KB 获取一个安全点)。Zing 确实如此,因为我们做了很多幕后工作来控制 TTSP。

  7. 所有 [实际] JVM 都应用了一些高效的机制来频繁跨越安全点机会,其中线程实际上不会进入安全点,除非其他人指示需要这样做。例如,生成的代码中的大多数调用站点和循环后沿将包含某种安全点轮询序列,相当于“我现在需要转到安全点吗?”。许多 HotSpot 变体(OpenJDK 和 Oracle JDK)目前使用一个简单的全局“转到安全点”指示器,其形式是页面,当需要安全点时,该页面受到保护,否则不受保护。此机制的安全点轮询相当于从该页面中的固定地址加载。如果加载使用 SEGV 捕获,则线程知道它需要进入安全点。Zing 使用不同的、每个线程的转到安全点指示器,其效率相似。

  8. 所有 JNI 代码都在安全点执行。处于安全点时,JNI 代码无法更改或观察执行线程的 Java 机器状态。JNI 代码对 Java 状态的任何操作或观察都是通过 JNI API 调用实现的,这些调用在 API 调用期间离开安全点,然后再次进入安全点,然后返回调用 JNI 代码。这种“跨越 JNI 线”是大多数 JNI 调用和 API 开销所在,但它相当快(进入和离开安全点通常相当于一些 CAS 操作)。

3.可能遇到安全点的操作

  • 去优化
  • 打印线程
  • 打印JNI
  • 查找死锁
  • 线程转储
  • 启用偏向锁定
  • 撤销偏见
  • 堆转储器
  • 获取所有堆栈跟踪信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/742403.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何以管理员身份运行CMD?

好久没更新博客了,今天在日常使用中遇到了一个问题,顺便记录下来。 据说国内的谷歌浏览器 Chrome 可以自动升级了,终于不用每次都自己跑去官网下载最新版本,然后安装迁移,重复劳动。下一篇讲如何讲迁移 Chrome&#x…

【Python】已解决:Python读取字典查询键报错“KeyError: ‘d‘”

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:Python读取字典查询键报错“KeyError: ‘d’” 一、分析问题背景 在Python编程中,字典(dictionary)是一种非常重要的数据结构…

源码分析过滤器与拦截器的区别

博主最近刚拿到一个微服务的新项目,边研究边分析从框架基础开始慢慢带领大家研究微服务的一些东西,这次给大家分析下Springboot中的过滤器和拦截器的区别。虽然上次分析过过滤器,但是主要是分析的cas流程,所以就没太深入&#xff…

[创业之路-129] :制造业企业的必备管理神器-ERP-生产制造

目录 一、ERP生产制造的总体架构 1.1 主要功能模块 1.2 主要流程 二、关键功能详解 2.1 生产管理计划 2.2 物料需求计划MRP 2.3 能力需求计划 2.4 物料与库房管理 一、ERP生产制造的总体架构 1.1 主要功能模块 ERP(企业资源计划)生产制造系统主…

微信小程序修改应用名称

1、修改名称(10分钟即可生效) 账号管理员 2、修改icon(如果logo带有名称则需要修改)

零基础STM32单片机编程入门(二)GPIO详解及驱动LED灯实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机GPIO口特点二.STM32单片机GPIO内部结构图三.单片机GPIO推挽输出信号流向四.单片机GPIO浮空输入信号流向四.单片机GPIO引脚的复用以及重映射五.CubeMX配置一个GPIO输出驱动LED灯例程六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一…

MATLAB基础应用精讲-【数模应用】协方差分析 (ANCOVA)

目录 几个高频面试题目 协方差分析和多因素方差分析区别 因子方差分析和协方差分析对比 情景1 因子方差分析的主要内容 SPSS实现因子方差分析 情景2 协方差分析的主要内容 SPSS中进行协方差分析 几个相关概念 算法原理 什么是协方差分析 算法特点 ANCOVA 的步骤 …

如何处理消息积压问题

什么是MQ消息积压? MQ消息积压是指消息队列中的消息无法及时处理和消费,导致队列中消息累积过多的情况。 消息积压后果: ①:消息不能及时消费,导致任务不能及时处理 ②:下游消费者处理大量的消息任务&#…

制造业ERP五大生产模式详解!

制造业面临着从成本控制、生产效率到供应链管理的挑战,每一个环节都需要精细化的管理和高效的协同。而ERP系统,作为一种集信息技术与管理思想于一体的管理工具,正逐渐成为制造业转型升级的关键。那么,通过本文你将会了解到&#x…

压电风扇的显著特点及其在电子系统中的应用

压电已经存在了一个多世纪,人们发现某些晶体结构在受到机械应力时产生表面电荷。 这种形式的压电传感器是压电传感器的工作方式。与压电传感器(或发电机)类似,压电致动器(或电机)使用补丁[1,3]形式的压电陶…

软件质量保证与测试

目录 一、测试流程 二、测试用例 2.1概念 2.2用例编写格式 三、设计测试点 3.1等价类 3.1.1概念 3.1.2案例 3.1.3适用场景 3.1.4执行用例 3.2边界值 3.2.1概念 3.2.2案例 3.2.3使用场景 3.3判定表 3.3.1判定表使用原因 3.3.2概念 3.3.3案例 3.3.4使用场景 …

【Linux】Ubuntu 部署 Zabbix 7.0

实验环境:Ubuntu-22.04 官方下载地址: 下载Zabbix 7.0 LTS for Ubuntu 22.04 (Jammy), MySQL, Apache 1、下载 Zabbix 官方安装包以及环境配置 下载 zabbix 安装包 wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabb…

Go语言之数据类型

网站:http://hardyfish.top/ 免费书籍分享: 资料链接:https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码:3899 免费专栏分享: 资料链接:https://url81.ctfile.com/d/57345181-6161623…

篮球联盟管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,球员管理,用户管理,球队管理,论坛管理,篮球资讯管理,基础数据管理 前台账户功能包括:系统首页&#xff0…

解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)

错误消息 ssh: connect to host IP port 22: Connection timed out 指出 SSH 客户端尝试连接到指定的 IP 地址和端口号(默认 SSH 端口是 22),但是连接超时了。这意味着客户端没有在预定时间内收到来自服务器的响应。 可能的原因 SSH 服务未…

【数据结构与算法】最短路径,Floyd算法,Dijkstra算法 详解

Floyd算法 for (int k 0; k < n; k) {for (int i 0; i < n; i) {for (int j 0; j < n; j) {if (d[i][k] ! INF && d[k][j] ! INF) {d[i][j] min(d[i][j], d[i][k] d[k][j]);}}} }Dijkstra算法&#xff08;基于最小堆&#xff09; void dijkstra(int st…

【JavaEE精炼宝库】多线程进阶(1)常见锁策略 | CAS | ABA问题

目录 一、常见的锁策略&#xff1a; 1.1 悲观锁 | 乐观锁&#xff1a; 1.2 重量级锁 | 轻量级锁&#xff1a; 1.3 自旋锁 | 挂起等待锁&#xff1a; 1.4 公平锁 | 非公平锁&#xff1a; 1.5 可重入锁 | 不可重入锁&#xff1a; 1.6 互斥锁 | 读写锁&#xff1a; 1.7 面…

服务器神秘挂起:一场惊心动魄的内核探案

2024年6月17日&#xff0c;我们的运维团队突然收到了一连串的告警。监控大屏上&#xff0c;代表着不同 Sealos 可用区的绿点中&#xff0c;零星地闪烁起了一两个红点。 “奇怪&#xff0c;怎么有几台服务器突然 hang 住了&#xff1f;” 值班的小辉皱起了眉头。 这次故障的诡…

python遍历文件夹中所有图片

python遍历文件夹中的图片-CSDN博客 这个是之前的版本&#xff0c;现在这个版本会更好&#xff0c;直接进来就在列表中 path glob.glob("1/*.jpg")print(path)print(len(path))path_img glob.glob("1/*.jpg")path_img.extend(path)print(len(path_img))…

基于Hexo+GITHUB搭建个人博客网站(PS:不用域名,不用服务器,重点是免费,小白也能轻松掌握)

✌ 作者名字&#xff1a;高峰君主 &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4ac; 人生格言&#xff1a;没有我不会的语言&#xff0c;没有你过不去的坎儿。&#x1f4ac; &#x1f5…