文章目录

  • CMS在并发标记阶段,已经被标记的对象,又被新生代跨带引用,这时JVM会怎么处理?
  • 为什么 Minor GC 会发生 STW?
  • 有哪些对象是在栈上分配的?
  • 对象在 JVM 中的内存结构
  • 为什么需要对齐填充?
  • JVM 对象分配空间机制
  • JVM多线程并发分配对象如何解决堆抢占?
  • JVM容量分配实战案例分析
  • JVM吞吐量和响应时间?

CMS在并发标记阶段,已经被标记的对象,又被新生代跨带引用,这时JVM会怎么处理?

CMS 垃圾回收器 中使用 “记忆集(Remembered Set)”+“写屏障(Write Barrier)”机制 来解决并发标记期间 跨代引用变更 问题。

为什么需要“记忆集” + “写屏障”?
在 CMS 的 并发标记阶段:
GC 与应用线程并发执行;
这期间应用线程可能让年轻代对象指向老年代对象;
但 CMS 默认只标记老年代;
年轻代未被扫描,容易 遗漏跨代引用;
所以必须 追踪引用变更的位置 —— 这就是“写屏障 + 记忆集”组合机制的作用。

写屏障:屏障是一种插入到对象引用写操作前后的特殊代码逻辑,用来记录引用的变化,在 CMS 里主要用于:

  1. 记录跨代引用的变化(新生代指向老年代的引用);
  2. 追踪老年代中对象引用的新增或变化,保证并发标记不遗漏
    什么是记忆集?
    记忆集是一种 记录哪些区域可能包含跨代引用 的辅助数据结构。
    在 CMS 中使用的是:Card Table + Dirty Card Tracking

写屏障的实现:

Card Table 工作机制:
老年代内存被划分为很多小块,每块称为一个 Card(比如 512 Bytes 一块);
JVM 为每个 Card 维护一个字节标记(位于 Card Table 中);
这个字节初始值为 clean(0);
一旦写屏障检测到某个 Card 中的对象引用发生变化,就将对应字节标记为 dirty(1)。

记忆集:
记忆集的本质是一个辅助数据结构,用来记录老年代对象中引用了新生代对象的“引用源地址”。
分代垃圾回收中,Minor GC 只扫描新生代,但可能有老年代对象引用了新生代;
为了避免扫描整个老年代,JVM用记忆集来记录那些引用过新生代的老年代对象;
在 Minor GC 时,只需要扫描记忆集中的那部分老年代对象

为什么 Minor GC 会发生 STW?

  1. 避免对象引用混乱
    Eden 和 Survivor 区中的对象需要移动到 To 区或老年代;
    在对象“复制”过程中,如果程序继续运行,会有引用被修改、丢失或读取脏数据;
    所以,必须暂停所有线程,保证引用关系不变、对象移动安全。
  2. 根可达性分析需要一致的对象图
    GC 需要做 可达性分析(Root Tracing),从 GC Roots 开始向下遍历;
    如果线程在动,分析得到的对象图会是错误的。

有哪些对象是在栈上分配的?

在 JVM 中,“对象在栈上分配” 并不是默认行为,而是一种通过逃逸分析(Escape Analysis)+ 栈上分配优化才有可能实现的高级性能优化机制。默认情况下,Java 中的所有对象都是在堆上分配的,只有局部变量的引用在栈帧中分配。
在栈上分配的条件:

  1. 对象不会逃逸出当前方法,也就是对象只在方法内被使用,不会被返回、不会赋给其他线程可访问的变量。
  2. JVM 启用了逃逸分析优化

栈上分配的优点:
3. 分配速度极快 栈是连续内存,分配只需移动指针(非常快);
4. 自动回收 随方法调用结束,局部变量出栈即自动回收;
5. 不会触发 GC 不在堆上,就不会进入 GC 管理范围;
6. 减少内存碎片 不参与堆整理,降低 Full GC 频率;
7. 标量替换优化可能性 JVM 可能将对象拆分为基本类型变量,进一步提升性能;

对象在 JVM 中的内存结构

  1. 对象头(Header)
    包含两部分信息:
    (1)Mark Word(标记字段) - 占 8 字节(32位JVM)或 12 字节(64位JVM 非压缩指针)
    存储内容因对象状态而异,如:
    HashCode(如果调用过 hashCode())
    GC 分代年龄
    锁信息(轻量级锁、重量级锁、偏向锁)
    标记位(是否为偏向锁/是否为垃圾对象等)
    (2)Class Pointer(类型指针) - 指向类的元数据
    指向方法区中该对象所属类的 class 元信息,用于支持虚方法调用等。
  2. 实例数据(Instance Data)
    真正存放类的 字段(成员变量)值 的地方,包括:
    父类继承下来的字段
    自身定义的字段
    按照 字段声明顺序、类型大小对齐 安排内存布局
  3. 对齐填充(Padding)
    为了满足 8 字节对齐(HotSpot 默认对象起始地址对齐规则),可能会在对象末尾填充一些字节
    不参与逻辑数据存储,只是内存对齐需要

为什么需要对齐填充?

  1. CPU 访问效率
    CPU 访问内存时,更快的访问方式是**按固定字节边界对齐(alignment)**访问,比如 4 字节对齐、8 字节对齐。
    如果数据没有对齐,CPU 需要分多次访问内存才能读取完整数据,导致性能下降。
    对齐保证数据起始地址是特定边界的整数倍,能让 CPU 一次性高效读取。
  2. 硬件平台的限制
    一些处理器架构要求特定类型数据必须对齐访问,不对齐访问会引发硬件异常(bus error),或者不得不做额外处理,降低性能。
    例如,64位系统一般要求 8 字节对齐,32位系统一般要求 4 字节对齐。
  3. 简化内存地址计算
    对齐后,硬件和编译器可以更简单更快地计算内存地址和偏移,方便高效的指令执行。

JVM 对象分配空间机制

  1. 堆内存分配
    Java 对象主要在 **堆(Heap)**上分配。
    堆又分为 新生代(Young Gen)和 老年代(Old Gen)。
    新生代通常使用 Eden 区 + 两个 Survivor 区。
  2. 对象分配流程
    新生代 Eden 区是对象分配的主要场所。
    JVM 默认采用 指针碰撞(Pointer Bump) 或 空闲列表(Free List) 分配策略:
    指针碰撞:Eden 是连续空间,有个指针指向下一分配位置,分配对象时指针往后移,速度快。
    空闲列表:如果 Eden 有碎片,可能采用空闲列表分配。
    大对象(如大数组、字符串)可能直接进入老年代,避免在新生代频繁复制。
  3. 分配失败与垃圾回收
    Eden 空间不足时触发 Minor GC,回收无用对象。
    Minor GC 后仍空间不足时,可能触发 Full GC 或对象晋升到老年代。

JVM多线程并发分配对象如何解决堆抢占?

  1. 多线程分配对象时,如果都操作同一内存区域,会产生同步开销,降低性能。
  2. JVM 采用 线程本地分配缓存(TLAB,Thread Local Allocation Buffer) 来缓解:
    每个线程分配一个小的 Eden 子区域(TLAB)。
    线程先从自己 TLAB 分配,避免和其他线程竞争堆主区域锁。
    只有当 TLAB 空了,才去堆中申请新的 TLAB。
  3. TLAB 分配流程示意
    线程启动时,JVM 为它分配一个初始的 TLAB。
    分配新对象时,线程检查 TLAB 剩余空间是否足够。
    足够,直接在 TLAB 内分配,调整指针。
    不足,从堆中申请新的 TLAB,再分配。
    对象生命周期结束后,垃圾回收释放对象,回收空间。

JVM容量分配实战案例分析

每天100w次登陆请求, 8G 内存该如何设置JVM参数,大概可以分为以下几个步骤。

  1. 任何新的业务在上线之前我们都需要预估其占用的内存大小,而我们分配空间的大小主要来根据以下步骤来判断?
  2. 计算业务系统每秒钟创建的对象会占用多大的内存空间,然后计算集群下的每个系统每秒的内存占用空间(对象创建速度)
  3. 设置一个机器配置,估算新生代的空间,比较不同新生代大小之下,多久触发一次MinorGC。
    为了避免频繁GC,就可以重新估算需要多少机器配置,部署多少台机器,给JVM多大内存空间,新生代多大空间。
  4. 根据这套配置,基本可以推算出整个系统的运行模型,每秒创建多少对象,1s以后成为垃圾,系统运行多久新生代会触发一次GC,频率多高。

具体的案例分析:
新增计费业务,预计每天1000万次请求,高峰时期,每秒处理2000笔的并发,一共5台机器内存大小8G,怎么算每台机器分配多大内存能撑住并发?
1.每秒2000笔,分到每台机器上的请求为400笔,加入每个请求所产生的对象大小为300字节,每个请求大概需要10个对象处理,我们暂估3KB,如果算上RPC和DB、写库、写缓存一顿操作下来6KB的数据,每秒大概产生1~2M的数据,如果高峰期,我们分配的内存为6G,分配给新生代的大小,大概是2G,我们算出大概1000秒才会进行一次MinorGC。

JVM吞吐量和响应时间?

吞吐量是指程序用于处理业务的时间与总运行时间的比值。

吞吐量 = (总运行时间 - GC 时间) / 总运行时间

吞吐量越高,说明更多时间用于业务处理,GC 开销更小。
高吞吐通常意味着:
较少 GC 次数
较长 GC 停顿时间
适合批处理、后台计算任务。

响应时间是指系统对单个请求的响应速度,包括平均响应时间和最大响应时间(99%、99.9% 等分位)。
对交互式系统、低延迟系统(如支付系统、API 网关)非常关键。
低响应时间通常意味着:
更频繁的 GC(避免长时间停顿)
GC 停顿更短
适合前台服务、实时交互系统

堆内存大小 和GC 频率和停顿时间之间的关系:
堆大 ⇒ GC 少发生 ⇒ 每次 GC 回收更多对象 ⇒ 吞吐量大
但:每次 GC 停顿时间长 ⇒ 阻塞线程多 ⇒ 响应延迟上升
堆小 ⇒ GC 更频繁发生 ⇒ 每次 GC 停顿短
但:每次处理对象少 ⇒ 更频繁打断业务执行 ⇒ 吞吐下降 ⇒ CPU 被 GC 占用比例升高

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3_STM32开发板使用(STM32F103ZET6)

STM32开发板使用(STM32F103ZET6) 一、概述 当前所用开发板为正点原子精英板,MCU: STM32F103ZET6。一般而言,拿到板子之后先要对板子有基础的认识,包括对开发板上电开机、固件下载、调试方法这三个部分有基本的掌握。 二、系统开机 2.1 硬件连接 直接接电源线或Type-c线…

crackme012

crackme012 名称值软件名称attackiko.exe加壳方式无保护方式serial编译语言Delphi v1.0调试环境win10 64位使用工具x32dbg,PEid破解日期2025-06-18 -发现是 16位windows 程序环境还没搭好先留坑

CppCon 2016 学习:I Just Wanted a Random Integer

你想要一个随机整数&#xff0c;用于模拟随机大小的DNA读取片段&#xff08;reads&#xff09;&#xff0c;希望覆盖不同长度范围&#xff0c;也能测试边界情况。 代码部分是&#xff1a; #include <cstdlib> auto r std::rand() % 100;它生成一个0到99之间的随机整数&…

MySQL层级查询实战:无函数实现部门父路径

本次需要击毙的MySQL函数 函数主要用于获取部门的完整层级路径&#xff0c;方便在应用程序或SQL查询中直接调用&#xff0c;快速获得部门的上下级关系信息。执行该函数之后简单使用SQL可以实现数据库中部门名称查询。例如下面sql select name,GetDepartmentParentNames(du.de…

Python初学者教程:如何从文本中提取IP地址

Python初学者教程:如何从文本中提取IP地址 在网络安全和数据分析领域,经常需要从文本文件中提取IP地址。本文将引导您使用Python创建一个简单但实用的工具,用于从文本文件提取所有IP地址并将其保存到新文件中。即使您是编程新手,也可以跟随本教程学习Python的基础知识! …

【Redis】Redis核心探秘:数据类型的编码实现与高速访问之道

&#x1f4da;️前言 &#x1f31f;&#x1f31f;&#x1f31f;精彩导读 本次我们将全面剖析Redis的核心技术要点&#xff0c;包括其丰富的数据类型体系、高效的编码方式以及秒级响应的性能奥秘。对于渴望深入理解Redis底层机制的技术爱好者&#xff0c;这是一次难得的学习机会…

Halcon —— 多种二维码检测

工业视觉实战&#xff1a;Halcon多类型二维码识别技术详解 在工业自动化场景中&#xff0c;兼容多种二维码类型是提高生产线灵活性的关键。本文将深入解析Halcon实现Data Matrix、QR Code和PDF417三种主流二维码的兼容识别方案&#xff0c;并重点解释核心算子参数。 一、多类型…

安卓vscodeAI开发实例

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 目录 一、安卓开发基础与工具链革新 1.1 Android Studio的局限性分析 1.2 VSCode在移动开发中的崛起 1.3 跨平台开发工具链对比…

③通用搜索---解析FastAdmin中的表格列表的功能

深度解析FastAdmin中的表格列表的功能-CSDN博客文章浏览阅读25次。本文将FastAdmin框架的CRUD功能配置要点进行了系统梳理。官方文档与开发经验相结合&#xff0c;详细介绍了菜单显示、TAB过滤、通用搜索、工具栏按钮、动态统计、快速搜索等17项功能的配置方法。包括字段渲染&a…

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_项目里程碑示例(CalendarView01_22)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Python爬虫实战:获取Diesel电商数据并分析

1. 引言 在当今数字化时代,电商平台积累了海量的产品和用户数据。通过对这些数据的挖掘和分析,企业可以深入了解市场动态、消费者需求和竞争态势,从而制定更有效的营销策略和产品规划。Diesel 作为知名的时尚品牌,其在电商平台上的表现备受关注。本研究旨在通过 Python 爬…

Spring RestTemplate + MultiValueMap vs OkHttp 多值参数的处理

&#x1f4cc; Spring RestTemplate vs OkHttp&#xff1a;多值参数处理 一、MultiValueMap 与 FormBody 的差异 特性RestTemplate MultiValueMapOkHttp FormBody多值参数支持✅ 原生支持&#xff08;add("key", "value") 自动追加&#xff09;❌ 需显…

GelSight视触觉3D轮廓仪赋能Beomni人形机器人触觉遥测,开启人形机器人触觉应用新场景

在智能制造、航空航天等领域&#xff0c;传统机器人常面临操作精度不足、环境适应力弱等问题。GelSight触觉传感技术与Beomni人形机器人的融合&#xff0c;为这些场景提供了新可能 —— 通过亚微米级触觉感知能力&#xff0c;操作员可远程感知物体表面细节&#xff0c;在复杂环…

python设置word的字体颜色

这个错误是由于python-docx的RGBColor对象没有.rgb属性导致的。正确的属性访问方式是分别获取红、绿(g)、蓝(b)三个分量。以下是修复方案&#xff1a; 错误原因分析 RGBColor对象的结构如下&#xff1a; from docx.shared import RGBColorcolor RGBColor(255, 204, 51) pri…

推荐模型之GBDT-LR

一、概念 GBDT-LR模型由FaceBook&#xff08;现在的Meta&#xff09;团队于2014年在论文《Practial Lessons from Predicting Clicks on Ads at Facebook》中提出&#xff0c;目标是用于预测FaceBook的广告点击量&#xff08;实际上广告和推荐领域很多算法模型都是共用的&#…

Java实现Excel图片URL筛选与大小检测

Java实现Excel图片URL筛选与大小检测 在数据处理场景中&#xff0c;我们常需筛选Excel中的图片URL。本文分享一个完整的Java方案&#xff0c;涵盖从读取图片URL到检测有效性、筛选大小&#xff0c;再到生成新Excel文件的全过程&#xff0c;同时讲解开发与优化过程&#xff0c;…

Java 实现后端调用 Chromium 浏览器无头模式截图的方案

Java 实现后端调用 Chromium 浏览器无头模式截图的方案 1. 使用 Playwright 优点&#xff1a;功能强大、支持多浏览器&#xff08;Chromium/Firefox/WebKit&#xff09;、支持异步操作。实现方式&#xff1a; 利用 Playwright 创建无头浏览器实例&#xff1b;使用 Java 的调度…

基于多模态文档解析与RAG的行业知识库构建技术指南

1. 技术背景 随着企业非结构化数据&#xff08;扫描件、PDF、图像等&#xff09;占比超过80%&#xff0c;传统关键词检索已无法满足精准问答需求。本文提出融合**计算机视觉&#xff08;CV&#xff09;与大语言模型&#xff08;LLM&#xff09;**的解决方案&#xff0c;关键技…

基于YOLOv11+PP-OCRv5深度学习的智能车牌检测与识别系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 智能车牌检测与识别系统借助当下前沿的 YOLOv11 算法以及 PP-OCRv5 算法&#xff0c;能够在复杂多样的环境场景中&#xff0c;快速且精准地达成实时车牌检测与识别任务。在现代交通管理领域&#xff0c;该技术意义重大&#xff0c;它能够推动涉及车辆识别与记录的…

[深度学习]全连接神经网络

目录 一、实验目的 二、实验环境 三、实验内容 3.1 完成解压数据集相关操作 3.2分析代码结构并运行代码查看结果 3.3修改超参数&#xff08;批量大小、学习率、Epoch&#xff09;并对比分析不同结果 3.4修改网络结构&#xff08;隐藏层数、神经元个数&#xff09;并对比分…