来聊聊JVM中安全点的概念
文章目录
- 写在文章开头
- 详解safepoint基本概念
- 什么是安全点?为什么需要安全点
- JVM如何让线程跑到最近的安全点
- 线程什么时候需要进入安全点
- JVM如何保证线程高效进入安全点
- 如何设置安全点
- 用一次GC解释基于安全点的STW
- 实践-基于主线程休眠了解安全点的工作过程
- 代码示例
- 基于日志印证执行流程
- 优化思路
- 关于安全点更进一步的理解
- 关于安全点的调优建议
- JDK11对于安全点的优化
- RocketMQ中对于安全点的优化
- 小结
- 参考
写在文章开头
近期在分享关于synchronized
关键字的文章的时候提到了一个关于安全点的概念,有读者反馈这块知识点讲的有些潦草,遂以此文简单介绍一下JVM
中关于安全点的概念。
详解safepoint基本概念
什么是安全点?为什么需要安全点
在正式讲解安全点之前,我们不妨复习一下JVM
中垃圾回收的基本过程,我们以CMS
垃圾回收器为例,其垃圾回收过程在完成GC Roots
查找与收集之后就会按照如下步骤执行:
- 初始标记
- 并发回收
- 最终标记(重新标记)
- 并发清除
要知道固定可作为GC Roots
的节点主要是:
- 全局引用:例如常量或者静态变量。
- 执行上下文即栈帧中的变量表。
对于现代java
应用而言,光是方法区就可能有数百上千兆,所以对于这些起源的引用也并非一件容易的事情。这也就意味着JVM
在进行垃圾回收时并不能通过逐个扫描检查来实现。
就目前主流的JVM来说,针对根节点枚举基本都是采用空间换时间的策略,也就是使用一组OopMap
,全称为"Object Pointer Map"(对象指针映射)
,本质上就是一个位图索引,它会通过以下两个时机完成对象信息的缓存:
- 类加载完成后,
hotSpot
就会基于类的偏移量信息计算出来并缓存。 JIT
阶段也会在特定的时机(这一点后续会详细说明)
计算出栈或寄存器中的那些位置是引用,并将其缓存。
如此一来,下次进行根枚举时就可以直接基于OopMap
高效完成:
但是java进程的运行的瞬息万变的,可能此刻的对象在下一刻就不可用,下一刻又有新的对象诞生,这种引用关系的实时变化亦或者说导致OopMap
内容变化的指令是非常多的,若针对每一个指令都设置对应的oopMap
,那么内存的开销是非常高昂的。
所以就有了安全点(safepoint)
的概念,这也就是我们上文所提及的特定的位置
,基于这个设定,用户的程序仅仅会在特定的情况下生成oopMap
,同理在垃圾回收时,也要求所有线程达到安全点后才能够暂停并进入STW
从而开始进行初始标记、最终标记等操作:
例如下面这段代码:
Object o=new Object();
对应汇编码如下,可以看到0x00000000031ffb8f
的call
指令,它指明偏移量40-852处有一个普通对象指针Oop(Ordinary Object Pointer)
:
0x00000000031ffb80: mov $0xf5,%edx0x00000000031ffb85: mov %ecx,%ebp0x00000000031ffb87: mov %rbx,0x28(%rsp)0x00000000031ffb8c: data16 xchg %ax,%ax0x00000000031ffb8f: callq 0x00000000030957a0 ; OopMap{[40]=Oop off=852};*new ; - java.lang.String::<init>@58 (line 205); - java.lang.String::substring@52 (line 1933); {runtime_call}
JVM如何让线程跑到最近的安全点
对于安全点上的线程中断策略,大体来说是有两种:
- 抢占式:当需要进入安全点时,
JVM
会主动挂起所有的用户线程,如果线程未在安全点则等到该线程进入安全点进入安全点并完成中断。这种做法最大的缺点就是时间不可控即很可能存在性能不稳定亦或者吞吐量的波动,所以截至目前还有那款虚拟机采用抢占式的方式完成线程中断。 - 主动式:这种方式是让线程去维护一个标志位,需要进入安全点时修改该变量,用户线程就会在合适的时机检查这个变量值,如果这个值为真时就进入安全点。
线程什么时候需要进入安全点
除了常见的垃圾回收标记触发STW使得所有线程需要进入安全点以外,对应的进入安全点的时机还有:
- 使用
jstat
、jmap
、jstack
等命令,为保证监控堆栈信息的实时正确性,所有线程需要STW并进入安全点暂停。 - JDK8默认情况下定时进入安全点,保证一些需要进入安全点的操作能够及时运行。
- JIT编译代码优化例如:OSR(栈上替换即一种运行时替换栈帧的技术)或者去优化即Bailout(将JIT编译后的代码回退,解释器模式),因为可能存在执行指令的变化,线程就需要进入安全点。
- java agent需要对类进行增强导致类重新定义,需要修改类的相关信息,所以需要进入安全点。
- 高并发情况下,锁升级机制会涉及偏向锁撤销,需要进入STW所以也需要进入安全点。
JVM如何保证线程高效进入安全点
我们以线程运行JIT编译好的代码为例,它的设计与实现步骤为:
- JVM初始化一个异常处理器,专门捕获对应的
page fault
缺页中断异常。 - JIT编译代码期间,会基于我们上述的规则在特定位置插入一条精简的指令,作为安全点检查。
- VM线程通知当前线程进入安全点,将线程内部维护的内存页即
polling page
设置为不可读。 - 线程执行这条机器码指令发现内存页不可读,触发缺点中断。
- 异常处理器捕获这个异常,线程进入安全点。
对应的我们也给出这段精简的汇编码指令,即test %eax,0x160100 ; {poll}
这段指令,这段指令本质上就是执行poll操作检查安全点,尝试访问线程内存页对应地址为0x160100
,如果发现不可访问则触发缺页中断进入安全点:
0x01b6d627: call 0x01b2b210 ;<
相关文章:

来聊聊JVM中安全点的概念
文章目录 写在文章开头详解safepoint基本概念什么是安全点?为什么需要安全点JVM如何让线程跑到最近的安全点线程什么时候需要进入安全点JVM如何保证线程高效进入安全点如何设置安全点用一次GC解释基于安全点的STW实践-基于主线程休眠了解安全点的工作过程代码示例基于日志印证…...
【AI面试准备】负责所有Al产品的模型能力评估及测试,保障AI产品的质量
面试岗位提出这个要求:负责所有Al产品的模型能力评估及测试,保障AI产品的质量。 目录 **一、AI产品模型评估的核心框架**1. **评估维度全景图**2. **质量保障全流程****二、关键模型类型评估策略**1. **分类模型(如推荐系统)**2. **生成模型(如GPT、Stable Diffusion)**…...

Nginx — http、server、location模块下配置相同策略优先级问题
一、配置优先级简述 在 Nginx 中,http、server、location 模块下配置相同策略时是存在优先级的,一般遵循 “范围越小,优先级越高” 的原则,下面为你详细介绍: 1. 配置继承关系 http 块:作为全局配置块&…...
mysql数据库备份与恢复方法
一、备份方法 逻辑备份(基于SQL语句) 使用mysqldump工具 全库备份:mysqldump -u root -p --all-databases > all_databases_backup.sql单库备份:mysqldump -u root -p jztdb > full_backup.sql排除特定表:--igno…...
实验三 软件黑盒测试
实验三 软件黑盒测试使用测试界的一个古老例子---三角形问题来进行等价类划分。输入三个整数a、b和c分别作为三角形的三条边,通过程序判断由这三条边构成的三角形类型是等边三角形、等腰三角形、一般三角形或非三角形(不能构成一个三角形)。其中要求输入变量&#x…...

线性代数—向量与矩阵的范数(Norm)
参考链接: 范数(Norm)——定义、原理、分类、作用与应用 - 知乎 带你秒懂向量与矩阵的范数(Norm)_矩阵norm-CSDN博客 什么是范数(norm)?以及L1,L2范数的简单介绍_l1 norm-CSDN博客 范数(Norm…...
Umi-OCR项目(1)
最近接触到了一个项目,我在想能不能做出点东西出来。 目标:识别一张带表格的图片,要求非表格内容和表格内容都要识别得很好,并且可视化输出为word文档。 下面是第一步的测试代码,测试是否能够调用ocr能力。 import re…...

【业务领域】电脑主板芯片电路结构
前言 由前几期视频合集(零基础自学计算机故障排除—7天了解计算机开机过程),讲解了POST的主板软启动过程;有不少网友留言、私信来问各种不开机的故障,但大多网友没能能过我们的这合集视频,很好的理清思路,那这样的情况…...

pandas读取Excel数据(.xlsx和.xls)到treeview
对于.xls文件,xlrd可能更合适,但需要注意新版本的xlrd可能不支持xlsx,不过用户可能同时需要处理两种格式,所以可能需要结合openpyxl和xlrd?或者直接用pandas,因为它内部会处理这些依赖。 然后,…...
【Nginx】负载均衡配置详解
Nginx作为高性能的HTTP服务器和反向代理服务器,提供了强大的负载均衡功能。本文将详细介绍Nginx负载均衡的配置方法和相关策略。 一、基础负载均衡配置 1.单服务示例配置 配置nginx.conf模块 在Nginx配置文件中定义upstream模块: worker_processes a…...

JVM——垃圾收集策略
GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间,…...

马克·雷伯特:用算法让机器人飞奔的人
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 马克雷伯特:用算法让机器人飞奔的人 一、天才的起点 在机器人领域,有一个名字如雷贯耳——马克雷伯特(Marc Raibert)。作为波士顿动力公司(Boston…...

信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV
原文链接:信创系统资产清单采集脚本:主机名IPMAC 一键生成 CSV Hello,大家好啊!今天给大家带来一篇在信创终端操作系统上自动批量采集主机名、IP 和 MAC 并导出为 CSV 表格的实战文章!本方案使用 sshpass 和 Bash 脚本…...

SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)
文章目录 一、不返回password字段二、返回的createTime和updateTime为空原因解决:开启驼峰命名和下划线命名的自动转换 设置返回的日期格式 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把对象序列化成json字符串时,忽略…...
小刚说C语言刷题—1602总分和平均分
1.题目描述 期末考试成绩出来了,小明同学语文、数学、英语分别考了 x、y、z 分,请编程帮助小明计算一下,他的总分和平均分分别考了多少分? 输入 三个整数 x、y、z 分别代表小明三科考试的成绩。 输出 第 11行有一个整数&…...
C++编译之(5)-cmake/CMakeLists.txt的编译使用教程
C++编译之(5)-cmake/CMakeLists.txt的编译使用教程 上一节,点这里 1、如何查看cmake的配置参数 那么如何查看当前配置的参数呢,我们可以使用-L参数 cmake .. -L # cmake .. -LAH完全使用命令行,则可以通过多次重复使用cmake … -DOPTION1=ON -D OPTION2=ON配置制定选项;并…...

Mac下安装Python3,并配置环境变量设置为默认
下载Python 访问Python官方网站 https://www.python.org/ 首先获得python3安装路径 执行命令: which python3 以我这台电脑为例,路径为:/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 编辑 bash_profile 文件 然后用 vim 打…...

Linux-04-用户管理命令
一、useradd添加新用户: 基本语法: useradd 用户名:添加新用户 useradd -g 组名 用户:添加新用户到某个组二、passwd设置用户密码: 基本语法: passwd 用户名:设置用户名密码 三、id查看用户是否存在: 基本语法: id 用户名 四、su切换用户: 基本语法: su 用户名称:切换用…...

【进阶】--函数栈帧的创建和销毁详解
目录 一.函数栈帧的概念 二.理解函数栈帧能让我们解决什么问题 三.相关寄存器和汇编指令知识点补充 四.函数栈帧的创建和销毁 4.1.调用堆栈 4.2.函数栈帧的创建 4.3 函数栈帧的销毁 一.函数栈帧的概念 --在C语言中,函数栈帧是指在函数调用过程中,…...
Hadoop伪分布式模式搭建全攻略:从环境配置到实战测试
引言 作为大数据生态的基石,Hadoop凭借其高可靠性、扩展性成为分布式计算的首选框架。本文将手把手带你完成Hadoop伪分布式模式部署,通过单节点模拟集群环境,为后续学习MapReduce、YARN等核心组件打下基础 目录 引言 Hadoop 发展历史 1.1 起源(2002–2005) 1.1 安装JDK…...
Transformer:颠覆深度学习的架构革命与技术演进
2017年,谷歌团队在论文《Attention Is All You Need》中提出的Transformer架构,彻底改变了人工智能对序列数据的处理范式。它不仅解决了传统循环神经网络(RNN)的长期依赖和并行化难题,更催生了BERT、GPT等划时代模型&a…...

【一】 基本概念与应用领域【数字图像处理】
考纲 文章目录 1 概念2005甄题【名词解释】2008、2012甄题【名词解释】可考题【简答题】可考题【简答题】 2 应用领域【了解】2.1 伽马射线成像【核医学影像】☆2.2 X射线成像2.3 紫外波段成像2.4 可见光和红外波段成像2.5 微波波段成像2.6 无线电波段成像2.7 电子显微镜成像2…...

NU1680低成本、无固件、高集成度无线充电电源接收器
无线充电 电子产品具有无线充电功能使用会更便利,介绍一款低成本、无固件、高集成度无线充电电源接收器NU1680 原理图和BOM可点绑定资源下载,LC部分电容建议X7R。 Load空载切满载测试 (CC Mode) – 尽量保证电子负载没有过冲 – 电子负载不要从0到满…...
JVM 内存分配策略
引言 在 Java 虚拟机(JVM)中,内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率,而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…...

2025MathorCup数学应用挑战赛B题
目录 模型建立与求解 1.问题一的模型建立与求解 1.1 搬迁补偿模型设计 1.2 住户是否搬迁的应对策略与分析 1.3 定量讨论 2.问题二的模型建立与求解 2.1 搬迁方案模型的优化介绍 2.2 模型的评估 2.3 模型结果 3.问题三的模型建立与求解 3.1 拐点存在性分析模型的建立 3.2 模型的…...

组件的基本知识
组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签,抽离放在一个独立的vue文件中,以供主vue文件使用 组成 三部分构成 template:HTML 结构 script: JS 逻辑 style: CSS 样…...

Origin绘图操作:图中迷你图绘制
一、背景描述 Origin绘图时,局部数据变化较小,在整体图片中表现为局部曲线重叠在一起,图中y1和y2在x0-2时重叠在一起,需要将局部放大,绘制迷你图 二、实现方法 1.在左边工具栏选择放大镜,按住ctrl在图中…...

数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)
一、核心挑战与量化分析 1. 版本演化困境的深度解析 (1) 格式断层的结构化危机 数据转换黑洞:某医疗信息平台(2021-2023)统计显示: 数据类型CDA R1→R2转换失败率R2→FHIR转换失败率关键失败点诊断记录28.4%19.7%ICD编码版本冲突(18.7%)用药记录15.2%12.3%剂量单位标准化…...

【GESP】C++三级练习 luogu-B2089 数组逆序重存放
GESP三级练习,一维数组练习(C三级大纲中5号知识点,一维数组),难度★☆☆☆☆。 题目题解详见:https://www.coderli.com/gesp-3-luogu-b2089/ 【GESP】C三级练习 luogu-B2089 数组逆序重存放 | OneCoderGE…...

Copilot 上线深度推理智能体 Researcher
近日,微软推出两款首创的工作场景推理智能体:Researcher(研究员)和Analyst(分析师)。它们能以安全合规的方式访问您的工作数据(包括邮件、会议、文件、聊天记录等)及互联网信息&…...