JVM垃圾回收算法、GC和分代回收、三色标记并发漏标、垃圾回收器

article/2025/9/19 7:33:26

 一.标记清除

标记速度与存活对象线性关系

清除速度与内存大小线性关系

        标记清除法分为标记阶段和清除阶段,标记阶段首先找到一些GC Root对象(根对象),根对象是那些一定不能被回收的对象。清除阶段比较简单,加标记的对象保留,没有标记对象清空。缺点:未加标记对象大概率都是不连续,释放之后的内存空间也是不连续的,这会造成内存碎片问题。每一段空闲内存都很小,如果程序需要一段比较大的内存时,则无法满足程序需要。唯一一个使用标记清除法的是CMS的垃圾回收器,他最新版本的jdk,已经将其废弃。 

二、标记整理

标记速度与存活对象线性关系

清除与整理速度与内存大小成线性关系

        标记整理法是对标记清除法的改进,第一个阶段和标记清除法类似,将未被标记的内存清理,那他多出一个整理阶段,他将存活的对象朝一端靠拢,中间不留空隙,保证内存有一大块连续空间。缺点:效率比较低,因为他需要移动内存空间

三、标记复制

标记与复制速度与存活对象成线性关系

        他讲内存分为两个区域from和to,刚开始to区域是空白的,他第一个阶段也是标记root对象,但是他没有清除的动作,他讲root对象的内容复制到to区域,复制完成后,他会将from区域全部清空,这时候to区域用于存对象,from是空闲区域。标记复制法比标记整理法效率更高。缺点:占用了一份额外的内存。

        标记复制法一般应用于新生代的垃圾回收,因为新生代存活对象少,只需要少量复制。老年代一般使用标记整理。        

四、谈谈GC和分代回收算法

1、GC

GC 的目的在于实现无用对象内存自动释放,减少内存碎片、加快分配速度

        GC 要点

                ①回收区域是堆内存,不包括虚拟机栈,在方法调用结束会自动释放方法占用内存

                ②判断无用对象,使用可达性分析算法三色标记法标记存活对象,回收未标记对象

                ③GC 具体的实现称为垃圾回收器

                ④GC 大都采用了分代回收思想,理论依据是大部分对象朝生夕灭,用完立刻就可以回                        收,另有少部分对象会长时间存活,每次很难回收,根据这两类对象的特性将回收区                      域分为新生代老年代,不同区域应用不同的回收策略

                ⑤根据 GC 的规模可以分成 Minor GCMixed GCFull GC

2、分带回收算法

分代回收

伊甸园 eden,最初对象都分配到这里,与幸存区合称新生代

幸存区 survivor,当伊甸园内存不足,回收后的幸存对象到这里,分成 from to,采用标记复制算法。如下动图,新生代只有6存活,复制过去,剩下清空。

老年代 old,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)

GC 规模

Minor GC 发生在新生代的垃圾回收,暂停时间短

Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有

Full GC 新生代 + 老年代完整垃圾回收,暂停时间长,应尽力避免

五、三色标记与并发漏标问题

1.用三种颜色记录对象的标记状态

        ①黑色 已标记(对象的引用已处理完成)

        ②灰色 标记中 (内部还有引用未处理完成)

        ③白色 还未标记 (还未被处理的)

下动图演示

2.漏标问题 记录标记过程中变化

        ①Incremental Update

                只要赋值发生,被赋值的对象就会被记录

        ②Snapshot At The BeginningSATB

                ①新加对象会被记录

                ②被删除引用关系的对象也被记录

        问题如下,右上角白色本来和灰色有一个连线,但是用户层将其断开,白色就会被回收,但是用户层也合一建立白色和黑色的引用,因为黑色已被标志处理完成,故白色无法清理,左下角的白色也是如此。

         解决方案两种:增量更新和原始快照。如问题中的黑色即为被复制对象会被记录,垃圾回收线程会监控所有赋值动作,一旦出现赋值就会被记录,换句话说黑色对象变成灰色的,等标记做完,让用户线程先不要运行,再做一次标记,这一遍处理就叫重新标记,这就是增量更新。新分配的对象记录下载,被删除引用关系的对象也会被记录,并发标记结束以后,暂停用户线程,进入重新标记,这就是原始快照。

五、垃圾回收器 

Parallel GC

        ①eden 内存不足发生 Minor GC,标记复制 STW

        ②old 内存不足发生 Full GC,标记整理 STW

        ③注重吞吐量

ConcurrentMarkSweep GC

        ①old 并发标记,重新标记时需要 STW并发清除

        ②Failback Full GC

        ③注重响应时间

G1 GC

        ①响应时间与吞吐量兼顾

        ②划分成多个区域,每个区域都可以充当 edensurvivorold humongous

        ③新生代回收:eden 内存不足,标记复制 STW

        ④并发标记:old 并发标记,重新标记时需要 STW

        ⑤混合收集:并发标记完成,开始混合收集,参与复制的有 edensurvivorold,其中 old                会根据暂停时间目标,选择部分回收价值高的区域,复制时 STW

        ⑥Failback Full GC

        第一阶段:新生代回收,刚开始区域都是空闲的,创建对象的时候就会挑选一些区域作为eden区,随着对象越来越多,eden区快要放满,放满了就会触发第一次新生代的垃圾回收。G1新生代内存占比在5%-6%之间波动,采用标记复制法回收,寻找幸存的对象放到survivor区,eden的内存会被释放。随着时间流逝,eden内存又耗尽了,这时候会把eden幸存对象和上一次survivor幸存对象放在一个幸存区,上一次幸存区有一些对象到了晋升阈值,他们就会被放到老年代区。

        接下来看看第二个阶段,触发条件,老年代内存越来越多,超过一个阈值,他才会触发标记,默认老年代的占比占掉堆的45%以上时,在老年代标记存活对象,它是并发执行,不会暂停用户线程。并发标记完成,进入第三个阶段,混合收集。他为了不超过设定的暂停时间,他不会一次性回收所有老年代,他会挑出回收价值较高的老年代,这些对象存活数量少,能释放更多内存,连同eden区和幸存区一起做垃圾回收,上次幸存区达到晋升阈值,和老年代幸存的对象放在一个新的老年代区域。在进行多次混合收集,又会进入新生代回收。特殊情况:回收速度小于需要分配新对象速度,这时候并发失败,会触发Failback Full GC,暂停时间比较长。

 

 


http://chatgpt.dhexx.cn/article/261FKTQO.shtml

相关文章

垃圾回收的主要区域是堆,那方法区会回收吗?

有些人认为方法区(如HotSpot虚拟机中的元空间或者永久代)是没有垃圾收集行为的,《Java虚拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集,事实上也确实有未实现或未能完整实现方法区类型卸载的收集器存在(如…

GC(垃圾回收)详解

JVM 1.年轻代:年轻代主要存放新创建的对象,垃圾回收会比较频繁。(稍微讲细一点就是即可,年轻代分成Eden Space和Suvivor Space。当对象在堆创建时,将进入年轻代的Eden Space。垃圾回收器进行垃圾回收时,扫描Eden Spac…

java---垃圾回收算法(GC)

目录 一、如何判断一个对象是否存活 1.引用计数法 2.可达性分析法 二、垃圾回收算法 1.标记清除法 2.复制算法 3.标记整理法 4.分代算法 具体流程 注意事项 空间分配担保原则 总结 一、如何判断一个对象是否存活 Java 堆中存放着几乎所有的对象实例,垃圾…

Java - GC 垃圾回收

JVM中一个垃圾回收线程,它的优先级较低,正常情况下不会执行。JVM空闲或者当前内存不足时,才会触发垃圾回收线程执行,扫描内没有被引用的对象,将这些对象添加到要回收的集合中进行回收。 GC介绍 Garbage Collection 垃圾收集,监测对象是否可…

GC是如何判断一个对象为垃圾的?被GC判断为垃圾的对象一定会被回收吗?

一.GC如何判断一个对象为”垃圾”的 java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。那么GC具体通过什么手段来判断一个对象已经”死去”的? 1.引用计数算法(…

基于28181协议的视频与平台的对接

问题描述 将IPC摄像头接入平台进行观看,或使用28181/rtsp/rtmp/flv等协议将视频流分发到其他平台。 解决方案 WVP-PRO(基于GB/T 28181-2016标准实现的流媒体平台),依托优秀的开源流媒体服务ZLMediaKit,提供完善丰富…

GB28181协议实现系列之----SDK Demo发布(7)

GB28181在终端的应用越来越广,但是一般很多做终端的厂家要加入到互联互通的GB28181网络协议栈中都必须招聘一些专业做GB28181的开发人员,并且需要对接各厂家的兼容性开发及对接调试工作,或是修改一些定制功能。安防市场一年有千亿以上的产值&…

GB28181协议之设备录像查询

目录 一、概述 二、GB28181录像文件查询 2.1 录像文件基本要求 2.2 命令流程 2.3 抓包文件抓图示例 三、国标平台介绍 一、概述 近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接…

ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台

ZLMediaKitwvp-GB28181-pro,搭建28181协议视频平台 一,简介 ZLMediaKit:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 一个基于C11的高性能运营级流媒体服务框架,项目地址:ZLMediaKit 特点: 基…

java gb28181网关_视频网关GB28181协议转换解决方案

原标题:视频网关GB28181协议转换解决方案 应用需求及问题: 四川某一所学校,校园内装置有上百个摄像头,学校监控系统是RTSP协议,现在需求要把校园的监控系统视频画面接入到公安系统里, 可公安系统只支持GB-T…

GB28181协议--校时

1、简介 根据《GB/T 28181 —2016》7.10、9.10的要求,GB28181设备网络校时功能描述如下: 联网系统内的IP 网络服务器设备宜支持 NTP(见IETF RFC2030) 协议的网络统一校时服务。 网络校时设备分为时钟源和客户端, 支持客户/服务器的工作模式; 时钟源应支…

GB28181协议常见几种信令流程(一)

在监控系统中,常见的摄像机设备互联协议有国际标准的ONVIF、国标的GB28181和各厂商的私有连接协议,本章从GB28181-2016中摘抄整理常见信令流程,如28181的会话/媒体通道、SIP基本注册/注销流程、客户端主动发起视频点播流程、设备控制流程等。…

国标GB28181协议客户端开发(一)整体流程和技术选型

国标GB28181协议客户端开发(一)整体流程和技术选型 本系列文章将介绍国标GB28181协议设备端的开发过程。本文旨在探讨整体设计和技术选型方面的考虑,为开发人员提供指导和参考。文章将从设备端开发的整体架构、信令交互流程以及关键技术选型等…

java gb28181网关_国标GB28181协议对接网关

国标GB28181网关概述 国标GB28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》最新版为2016年版,较2011年版更加完善,其是基于SIP协议的视频联网框架标准。因其核心应用于公安视频联网,在平安城市、雪亮工程超大规模视频监控联…

GB28181协议之录像回放

目录 一、概述 二、录像文件播放 2.1 基本要求 2.2 命令流程 2.3 抓包示例 2.3.1 Invite请求[SIP服务器---->设备] 2.3.2 Invite应答[设备---->SIP服务器] 2.3.3 ACK[SIP服务器---->设备] 2.3.4 Bye结束回放 2.3.5 Bye应答 2.3.6 播放速度控制 2.3.6 控制…

GB28181协议之实时视频

目录 一、概述 二、实时视频 2.1基本要求 2.2命令流程 2.3抓包示例 2.3.1 Invite请求[SIP服务器----->设备] 2.3.2 Invite应答[设备---->SIP服务器] 2.3.3 ACK[SIP服务器----->设备] 2.3.4 Bye 2.3.5 Bye应答 三、国标平台介绍 一、概述 近年来,国…

GB28181协议--实时视音频点播(预览)

1、基本要求 根据《GB/T 28181 —2016》第9章关于实时视音频点播的描述,其内容如下: 实时视音频点播的SIP 消息应通过本域或其他域的SIP 服务器进行路由、 转发, 目标设备的实时视音频流宜通过本域内的媒体服务器进行转发。实时视音频点播采用SIP 协议…

GB28181协议--心跳

1、心跳介绍: 根据《GBT 28181-2016 公共安全视频监控联网系统信息传输、交换、控制技术要求》9.6.1状态信息报送章节描述。 当源设备(包括网关、SIP 设备、SIP 客户端或联网系统) 发现工作异常时, 应立即向本 SIP 监控域的SIP服务器发送状态信息; 无异常时, 应定…

国标28181: 视频国标28181协议

国标的由来 GB28181国标解决平台与平台对接问题 比如A平台大连交警系统需要看B平台上海交警系统的视频。需要对接过来,实现调度视频。这时候需要知道他们取流的协议,各家厂商都自定义了一套协议,就很麻烦,因此国家就制定了GB28…

【C/C++】isalpha、islower、isupper、isalnum、isblank、isspace函数cctype / ctype.h头文件

isalpha、islower、isupper、isalnum、isblank、isspace这些函数都在<cctype>&#xff08;即C语言中的<ctype.h>&#xff09;的头文件里面&#xff0c;下图是它们所表示的范围&#xff1a; 总的来说就是&#xff1a; isalpha &#xff08;字母&#xff0c;包括大写…