苏州网络推广企业/快速刷排名seo软件
参考资料:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明
1、分代回收策略
-
分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
-
分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期放在不同代上,不同代采用最适合它的垃圾回收方法进行回收。
1.1 代际划分
1.2 垃圾回收
1.2.1 年轻代(新生代)
年轻代会划分出Eden
区域与两个大小对等的Survivor
区域。其比例一般为8:1:1,这是因为根据统计95%的对象朝生夕死,存活时间极短。
-
当新对象生成,并且在
Eden
申请空间失败时,就会触发GC,清理Eden
中的非存活对象,并且把存活的对象移动到Survivor
区,接下来整理两个Survivor
区域。 -
这种方式不会影响到年老代,因为大部分对象都是从Eden区开始的,所以
Eden
区垃圾回收十分频繁,需要快速、高效的算法(一般采用复制算法)。
1.2.2 年轻代收集(Minor GC/Young GC)
-
当新对象在
Eden
区域内存分配失败时就会触发年轻代的垃圾回收,称之为“Minor GC”
。 -
每个对象都有一个年龄,这个年龄就是指对象经历过
Minor GC
的次数。
如图一所示,对象刚分配到Eden时年龄为“0”,当Minor GC
被触发时,所有存活的对象会被拷贝到其中一个Survivor区域中,同时年龄增长“1”,最后清除Eden区域非可达对象。
如图二所示,当第二次Minor GC
被触发时、JVM会通过Mark算法 (标记算法)找出Eden区域和Survivor1区域存活的对象并将他们拷贝到新的Survivor2区域,同时年龄增长加“1”,最后清除Eden区域和Survivor1区域非可达对象。
如图三所示,当对象年龄足够大(年龄通过JVM参数设置),并且Minor GC再次发生,他就会从Survivor内存区域升级到年老代中。
1.2.3 年老代
-
年老代是用来存放长时间存活的对象的内存区域。
-
当对象在新生代中经历了多次垃圾回收仍然存活时,它们会被晋升到年老代。
-
年老代的垃圾回收频率较低,并且每次回收的成本较高。
在年老代选择的垃圾回收算法取决于JVM采用的什么垃圾回收器
1.2.4 年老代收集(Major GC/Old GC)
-
当
Minor GC
发生时,又有对象从Survivor区域升级到Tenured
区域,但是Tenured区域没有空间容纳新的对象,此时就会触发年老代的垃圾回收。 -
年老代的垃圾回收算法取决于JVM选择的垃圾回收器。
2、 垃圾收集算法(Mark)
2.1 标记-清除算法(Mark-Sweep)
过程:
算法分为标记、清除两个过程。
-
首先标记出所有需要回收的对象/标记存活的对象。
-
接下来清除未被标记的对象。
标记清除算法是最基础的算法,后续收集算法基本上都是以标记-清除算法为基础。
标记-清除算法的主要缺点有两个:
-
执行效率不稳定,如果 Java堆中有大量对象并且其中大部分需要回收,这时必须进行大量的标记清除动作导致两个过程执行效率随对象数量增加而增大。
-
空间碎片化严重,会产生大量不连续的空间碎片,碎片太多分配较大对象会导致没有足够的连续内存从而发生垃圾回收。
标记-清除算法执行过程如图所示:
2.2 标记-复制算法(Mark-Copy)
为了解决标记-清除算法面对大量可回收对象时执行效率低的问题,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
过程:
-
当其中一块内存用完时,将存活的对象复制到另一块上面。
-
然后清除使用过的这块内存。
标记-复制算法的缺点:
-
如果内存大多对象都是存活的,这种算法会产生大量的内存复制间的开销。
-
复制算法的代价就是将可用内存缩小了原来的一半,空间浪费较大。
标记-复制算法的执行过程:
2.3 标记-整理算法(Mark-Compact)
针对于年老代对象的存亡特征,提出了标记-整理算法,其标记过程和“标记-清除”算法一样,但是后续不是清除可回收对象而是让所有存活的对象都向内存空间一端移动。
-
标记-清除算法和标记-整理算法本质差异在于前者是一种非移动式的回收算法,而后者是移动的。
-
优点:这种方式避免碎片内存的产生,又不需要两块相同的内存
-
缺点:压缩操作需要进行局部对象移动
3、HotSpot算法的实现细节
3.1 根节点枚举
所谓“一致性”就是整个枚举期间不会出现枚举过程中,整个根节点集合的对象引用在不断发生变化。
-
主流Java虚拟机都是使用的
准确式垃圾收集
。当用户线程停下时,不需要一个不漏的检查所有执行上下文和全局引用位置。
在HotSpot的解决方案中:
-
使用一组称为OopMap的数据结构来达到目的。
-
一旦类加载完成,HotSpot就会将对象内什么偏移量上是什么类型的数据计算出来。
-
在即时编译中也会在
特定位置
(安全点)记录栈和寄存器里哪些位置是引用。
这样收集器扫描就可以直接得到这些信息,而不需要一个不漏的从方法区等待GC Roots查找。
3.2 安全点
-
导致OopMap内容变化的指令非常多,如果为每个指令生成对应的OopMap将需要大量的额外存储空间。
-
安全点决定了用户执行时不能在代码指令流的任意位置停下来进行GC,必须强制到达安全点才能执行GC。
-
安全点一般选取在“
是否具有长时间执行特征
”的地方,例如方法调用、循环跳转、异常跳转。
如何让垃圾收集发生时所有线程都跑到最近的安全点,然后停顿?
-
抢先式中断:在GC发生时,系统把用户线程全部中断,如果发现有中断的线程不在安全点上,就恢复这条线程执行,让它直到跑到安全点上中断。(现在几乎没有虚拟机采用这种方式)
-
主动式中断:需要中断线程时,不直接操作线程而是简单的设置一个标志位,各个线程执行时会不停的主动询问这个标志。一旦这个标志位为真就在自己最近的安全点上主动中断挂起。
3.3 安全区域
安全点似乎已经完美解决了停顿用户线程,让虚拟机进行垃圾回收状态。但是当程序“不执行”时,安全点就没有作用。
典型场景:用户线程处于Sleep状态/Blocked状态,这时线程无法响应虚拟机中断请求,不能走到安全的地方去中断挂起自己。
-
安全区是指确保在某一代码片段中,引用关系不会发生变化。因此这个区域任意地方发生垃圾回收都是安全的。
-
当用户线程执行安全区的代码,首先会标记自己已经进入了安全区域,这段时间虚拟机发起GC就不会管已声明自己在安全区的线程。
-
当线程需要离开安全区时,它会先检查虚拟机是否完成根节点枚举(或者GC过程中其他需要暂停用户线程的阶段)。如果完成那么线程就会继续执行,否则就会一直等待,直到收到离开安全区域的信号为止。
3.4 记忆集与卡表
在分代收集理论中,为了解决对象跨代引用所带来的问题,垃圾收集器在新生代中建立了名为记忆集
的数据结构。
记忆集是一种用于记录从非收集区指向收集区域指针集合的抽象数据结构,它用于缩减GC Roots扫描范围。
在垃圾收集的场景中,收集器只需要通过记忆集判断出某一块非收集区域是否存在指向收集区域的指针就行了,并不需要了解这些跨代指针的全部细节。
设计实现记忆集时,可以选择不同的记录粒度来节省记忆集的存储和维护成本:
第三种卡精度
是用一种“卡表
”的方式去实现记忆集,也是目前最常用实现记忆集的形式。 HotSpot虚拟机卡表的实现:
-
卡表最简单的形式可以是一个字节数组。
-
字节数组CARD_TABLE的每个元素都对应着其标识的内存区域中一块特定大小的内存块。
-
一个卡页中通常存在不止一个对象,只要卡页有一个对象存在跨代指针,就将对应的卡表数组元素标记为1,称“元素变脏”。
-
在垃圾收集时只需要,筛选卡表中变脏的元素,就能得到哪些卡页内存包含跨域指针,把它们加入GC Roots中扫描。
3.5 写屏障
我们使用记忆集缩减GC Roots扫描的范围问题,但是还没解决卡表元素如何维护,什么时候变脏,谁来让它变脏?
-
什么时候变脏?——有其他分代区域的对象引用了本区域对象时,对应卡表元素就应该变脏。
HotSpot通过写屏障
来维护卡表状态,帮助虚拟机跟踪对象引用的变化。
-
应用写屏障后,虚拟机就会为赋值操作生成相应指令,一旦收集器在写屏障增加了更新卡表的操作,无论更新是不是年老代对新生代对象的引用,每次对引用更新就会产生额外开销。但是这个开销远小于扫描这个年老代的开销。
-
卡表在高并发下还存在“伪共享”的问题。
现代CPU缓存系统是以
缓存行
为单位存储的多线程下修改互相独立的变量时,这些变量如果共享同一个
缓存行
,就会彼此影响导致性能降低。
相关文章:

JVM—垃圾收集算法和HotSpot算法实现细节
参考资料:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明 1、分代回收策略 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取…...

nvidia系列教程-AGX-Orin基础环境搭建
目录 前言 一、Agx-Orin(32GB)介绍 1.1 GPU 1.2 CPU 1.3 NVDLA 1.4 内存 1.5 存储 二、安装JetPack SDK 三、基础环境配置 四、jetpack软件版本 总结 前言 NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低…...

使用SpringAOP实现公共字段填充
文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表…...

c++初阶-----适配器---priority_queue
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...

VSCode上安装C#环境教程
本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…...

VS Code 和 Visual Studio 哪个更好
文章目录 VS Code 和 Visual Studio 哪个更好Visual Studio Code简介Visual Studio简介相同点差异点总结 VS Code 和 Visual Studio 哪个更好 Visual Studio Code简介 Visual Studio Code(简称 VS Code)是一款开源的、免费的、跨平台的、轻量级的代码编…...

FCA-数据分析理论试卷
其他参考: https://segmentfault.com/a/1190000043363073 https://blog.csdn.net/CSDN_WYY/article/details/137082340 Part.1:判断题(总分:8分 得分:8) 第1题 判断题 对任意事件A和B,必有 …...

WPF程序通过CadLib4加载CAD .dwg格式文件
1、下载CadLib相关dll文件,主要用到的:WW.dll、WW.Cad.dll、WW.GL.dll 2、程序中引用dll库。 3、创建WPF程序,使用Canvas来加载dwg文件,支持拖动和放大缩小。 4、部分代码: public void Init(string filename) {tr…...

图表全能王(ChartStudio) 上架VisionPro!
图表全能王(ChartStudio) - 终极图表制作工具!支持条形图、折线图、面积图、柱形图、条形图、饼图、玫瑰图、雷达图、牛肉图、风琴图、旭日图、桑基图等图表。 https://apps.apple.com/app/chartstudio-data-analysis/id6474099675 https://apps.apple.com/cn/app/…...

【云原生】Job一次性任务详解
Job一次性任务 文章目录 Job一次性任务一、Job介绍二、运行示例Job 一、Job介绍 Job会创建一个或者多个Pod,并将继续重试Pod的执行,直到指定数量的Pod成功终止。随着Pod成功借宿,Job跟踪记录成功完成的Pod个数。当数量达到指定的成功个数阈值…...

化工厂人员定位采用多种定位技术的融合定位系统的好处
由于化工厂内环境的复杂性和危险性,通常单一的定位技术很难满足全厂区的人员定位需求,如果能将不同定位技术融合在一起,发挥出它们各自的优势,那么就能解决以上问题。 融合定位技术诞生背景 随着科技的不断发展,多种定…...

使用AI绘图工具生成风景图像的教程
随着人工智能技术的飞速发展,AI绘图工具在图像生成和艺术创作方面变得越来越强大,无论你是一个设计师、艺术家,还是仅仅对生成艺术感兴趣的爱好者,AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中,…...

迷你主机:华硕PN65和nuc13pro如何选择?
华硕PN65与NUC 13 Pro:如何做出选择? 在追求高效能与便携性的今天,迷你主机成为了越来越多用户的选择。华硕PN65与英特尔NUC 13 Pro作为市场上两款备受瞩目的产品,各自拥有独特的优势和特点。本文将从处理器性能、扩展性、接口丰…...

分享一个好用的印花重绘工具
本文向大家介绍一款革命性的 AI 工具,它能够将模糊不清的图片转化为具有照片级别的高清图像。这项前沿项目依托于大规模人工智能技术,革新了图像恢复领域。通过文本驱动和智能修复功能,它巧妙地结合了先进的 AI 技术与创新理念,为…...

力扣题解(递增的三元子序列)
334. 递增的三元子序列 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则&#…...

做不好PPT的原因
新手制作PPT长犯的10个错误 1.Word搬家 为了节约时间,直接把Word素材复制粘贴到PPT上,没有提炼 2.堆积图表 每个页面上堆积了大量的图表,却没有说明数据反映了什么趋势 3.图表业余 想用图表达自己的逻辑,但没有专业的模板&a…...

嵌入式人工智能(45-基于树莓派4B的扩展板-舵机驱动板PCA9685)
1、简介 智能小车、机械臂、摄像头云台会有多个舵机,而微控制器芯片的PWM输出引脚不够的情况下,就可以用PCA9685(16路舵机)来解决这一问题。 PCA9685是一款I2C总线控制的16通道LED控制器,专为红/绿/蓝/琥珀ÿ…...

【数据结构与算法】建立多个栈的三种方案的优缺点分析
在一个算法中需要建立多个栈时可以选用以下三种方案之一,试问这三方案相比各有什么优缺点? (1)分别用多个顺序存储空间建立多个独立的顺序栈。 (2)多个栈共享一个顺序存储空间。 (3)…...

DjangoRF-14-创建request子应用
注意,本应该是requests模块,为了区分,避免错误,用request 1、进入apps,创建request django-admin startapp request 2、因为只发送请求,没有数据库相关,不需要model。 3、进行序列化 from rest_framework …...

SOMEIP_ETS_005:检查字节序
测试目的: 验证DUT在发送和接收参数时对字节序的处理能力。 描述 本测试用例旨在检验DUT在处理具有不同字节序的参数时,是否能够正确地发送和接收数据,并确保返回的UINT32值是传入的两个参数(UINT8和UINT16)的和。 …...

为什么要对医疗器械进行网络安全评估?
对医疗器械进行网络安全评估的原因主要有以下几点: 一、保障患者安全 直接关联患者健康:医疗器械与患者的生命健康直接相关,任何网络安全漏洞都可能导致设备被非法控制或数据泄露,进而威胁患者的生命安全。例如,黑客可…...

沃尔玛1P账号的强悍作用重要反映在那些方面?——WAYLI威利跨境助力商家
沃尔玛作为全球最大的零售商之一,其品牌影响力非常强大。商家通过入驻沃尔玛商超并开设1P账号,能够借助沃尔玛的品牌影响力来提升自身的品牌知名度和美誉度。这种品牌背书的效应,有助于商家吸引更多的消费者关注和购买自己的产品。 一、沃尔玛…...

学习python你不能不知道的几个接单平台!实现如月上万不是梦
学Python后,寻找兼职平台是一个很好的实践和提升技能的方式。以下是一些比较推荐的Python兼职平台: 国内平台 程序员客栈 网址:https://www.proginn.com介绍:程序员客栈是中国非常领先的自由工作平台,为中高端程序员、…...

Golang面试题三(map)
1.map底层实现 由图看出,其实map的底层结构体是hmap,同时hmap里面维护着若干个bucket数组(即桶数组)。bucket数组中每个元素都是bmap结构的,bmap中存储着8个key-value的键值对,如果是满了的话,当…...

[windows10]win10永久禁用系统自动更新操作方法
WinR打开运行 输入regedit打开注册表 点击确定打开注册表 按照如下路径找到UX 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 在空白处点击鼠标右键,新建选择DWORD,然后重命名为FlightSettingsMaxPauseDays 双击FlightSet…...

《西行取经:大学生编程之路的禅悟与陷阱规避2》
《西行取经:大学生编程之路的禅悟与陷阱规避2》 阿弥陀佛,贫僧唐僧,虽身处古代,心却向往智慧之光。观今世大学生于编程之途,犹如我等西天取经,路途遥远且布满荆棘。今欲以吾之“取经”心得,为尔…...

JVM从入门到放弃
前言:关于JVM,其实有很多大厂开发了不同版本的JVM,比较知名的有:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、 Azul VM、 Apache Harmony、 Google Dalvik VM、 Microsoft JVM等等。现在使用的比较多的JDK8版本就是Sun HotSpot V…...

中国地面太阳总辐射逐日资料
数据内容 数据包含站点总辐射辐照度日数据 数据样例 Station_ID_CStaion_NameYearMonDayV1431154832寿光2023116.285754832寿光2023127.778354832寿光2023138.374454832寿光2023147.19154832寿光2023157.506254832寿光2023168.505254832寿光2023179.822154832寿光20231810.0…...

微商来客小程序系统源码分享
微商来客小程序系统源码,这是最新的V7.5.8版本微商来客小程序快速开发系统源码,可以无限开发生成小程序,支持快速生成微信小程序,支付宝小程序,百度小程序,QQ小程序,头条/抖音小程序。能创建的小…...

Java面试题--JVM大厂篇之Parallel GC与其他垃圾回收器的对比与选择
目录 引言: 正文: 结束语: 引言: Java工程师们,当我们在谈论JVM性能优化时,垃圾回收器(GC)无疑是一个绕不开的话题。而在所有的垃圾回收器中,Parallel GC无疑是一个备受关注的角色。今天,我们就来一探究…...