GC的算法与种类

Jvm中GC种类和算法 1.什么是GC GC(GarbageCollection)是垃圾回收机制,在Java中开发人员无法使用指针来自由的管理内存,GC是JVM对内存(实际上就是对象)进行管理的方式。GC使得Java开发人员摆脱了繁琐的内存管理工作,让程序的开发更有效率。 2. GC基本原理 Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。   对于程序员来说,分配对象使用new关 阅读详情

GC的算法与种类

引用计数法

引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被使用。
这里写图片描述
【注】名词解释
可达对象:通过根对象进行引用搜索,最终可以到达的对象
不可达对象:通过根对象进行引用搜索,最终没有被引用到的对象

引用计数法的问题

引用和去引用伴随加法和减法,影响性能
很难处理循环引用
这里写图片描述
如图循环引用因为引用计数不为0,所以永远不会被GC。

标记-清除

标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。
这里写图片描述
标记清除存在一个问题,多次标记清楚过后容易形成过多的内存碎片

标记-压缩

标记-压缩算法适合用于存活对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
这里写图片描述
这种方式避免的内存碎片的产生

复制算法

复制算法将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。
这里写图片描述
与标记-清除算法相比,复制算法是一种相对高效的回收方法,但是复制算法需要多一倍的内存。

复制算法比较适用于新生代。因为在新生代,垃圾队形通常会多于存货对象,复制算法的效果会比价好。不适用于存活对象较多的场合如老年代。why?思考下

分代思想

对于复制、标记清除、标记压缩等GC算法各自都有优势和缺陷,在所有的算法中没有一种算法能够替代其他算法。因此根据垃圾回收对象的特性,使用合适的算法回收,才是明智的选择。

分代算法就是这种思想,它将内存区间根据对象的特点分成几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收的效率。

通常情况下JVM虚拟机的堆分为新生代和老年代。新生代的特点是对象存活时间一般不长,大约90%的新建对象会被很快回收,因此,新生代比较适合使用复制算法。当一个对象经过几次回收之后依然存活,对象就会被放入老年代的内存空间。在老年代中,几乎所有对象都是经过几次GC之后依然得以存活的。因此,可以任务这些对象,在一定时期内,甚至在应用程序的整个生命周期中,将是常驻内存的。所以使用标记清除或者标记压缩算法比较合适。

分区思想

分带算法按照对象的生命周期长短划分为两个部分,分区算法将整个堆空间划分成连续的不同小区间,每个小区间独立使用独立回收。这种算法的好处是可以控制一次回收多少个区间。这样可以让GC导致停顿时间拆短,如此GC多次每次时间变短。

谁才是真正的垃圾——判断可触及性

所有的算法,需要能够识别一个垃圾对象,因此需要给出一个可触及性的定义:即从根节点开始是否可以访问到这个对象,如果可以,则说明当前对象正在被使用,如果从所有的根节点都无法访问到某个对象,说明对象已经不再使用了,一般来说,此对象需要被回收。

简单来说可触及性包括以下3种状态:
可触及的:从根节点可以开始,可以到达这个对象。
可复活的:对象的所有引用被释放,不过finalize()函数没有被调用,可能在finalize()函数中复活。
不可触及的:对象的finalize()函数被调用,并且没有复活。
以上三种状态只有对象在不可触及时才可以被回收。

【注:根节点】
栈中引用的对象
方法区中静态成员或者常量引用的对象(全局对象)
JNI方法栈中引用对象

【注:finalize】
- finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
- finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性
- 不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);②作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]
但是finalize()依然是一个糟糕的模式,不推荐使用,因为finalize()可能发生引用外泄,无意中复活对象。更为重要的是finalize()是系统调用的,调用时间不明确,而try-catch-finally完全可以有更加好的效果。
参考finalize方法总结

对象的复活

举个例子:
这里写图片描述
这里写图片描述

引用的强弱

java中提供4个级别的引用:强引用、软引用、弱引用和虚引用
这里略过了….

Stop-The-World

Java中一种全局暂停的现象
全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
多半由于GC引起
1. Dump线程
2. 死锁检查
3. 堆Dump
危害
长时间服务停止,没有响应
遇到HA系统,可能引起主备切换,严重危害生产环境。

MR2数据集实战:5步搞定多模态谣言检测模型训练(附完整代码) 本文详细介绍了如何使用MR2多模态数据集构建高精度谣言检测系统,涵盖环境配置、数据准备、多模态特征工程、模型架构设计、训练调优及部署优化等5个关键步骤。通过双线性融合技术处理文本、图像和网页三模态数据,解决特征对齐和模态冲突等工程难题,并提供完整代码实现和性能优化方案。 阅读详情

相关推荐

模仿学习(Imitation Learning)概述

什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。......

qq_22749225的博客 2万+

GC种类和GC算法种类精简梳理

主要有五种GC: 1.Serial GC Serial体现在工作是单线程的,精简,但是垃圾收集时会进入"stop-the-world"状态。是JDK8中client模式下默认GC。新生代的Serial GC采用复制算法,老年代的Serial GC采用标记-整理算法,由于区别算法不同,老年代的Serial GC专称Serial Old。 -XX:+UseSerialGC 2.ParNew G...

白白胖胖充满希望 3708

MUJOCO+AUBO机械臂+强化学习+路径规划

最近在学习机械臂强化学习路径规划,参考了知乎教程。由于原教程较老(使用stable baselines3+panda-gym),新版本变化了,我略做调整,记录写在。上面这个教程用的是官方,环境封装较死(类似),最终基于重新开发。代码已开源至github:https://github.com/YellowThree-HS/mujoco-Aubo-RL-PathPlanning。

qq_63308550的博客 2043

【JVM】一文搞懂常见GC算法

GC目的程序运行过程中可能会产生许多垃圾对象,持续占用内存会造成内存泄漏,最终可能导致内存溢出,迫使系统中断运行。首先需要搞懂内存泄漏和内存溢出的概念!!!内存泄漏(memoryleak)是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。内存溢出(outofmemory)。)。)。内存效率。。.........

fearless的博客 6030

STC32G电调调试血泪史:从TPH1R403NL MOS管烧毁到PWM信号异常排查全记录

本文详细记录了STC32G无刷电调调试过程中的常见问题与解决方案,包括MOS管烧毁、PWM信号异常等关键故障排查。通过电源系统检测、驱动电路验证及三相平衡调试等实战经验,帮助硬件爱好者快速定位问题,提升电调调试效率。特别针对TPH1R403NL等MOS管的保护措施进行了重点分析。

weixin_33736048的博客 551

从“点云”到“图像”:华为896线激光雷达的技术飞跃与行业影响浅析

华为发布全球首款896线双光路激光雷达,实现车载感知从"3D点云"到"3D成像"的跨越。该产品采用创新双光路架构,集成广角和长焦单元,单帧点云量达128线产品的7倍,可在55米外识别小狗摇尾巴等细节。实测数据显示,其能识别120米外14厘米低矮障碍物,夜间低反射率目标识别距离提升190%。尽管速腾聚创随后发布更高线数产品,但华为强调实用性和量产可行性,成本仅增加1-2万元。这一突破标志着激光雷达进入大规模应用阶段,将加速高阶智驾功能普及,强化华为在智能汽车领域的技术底

致力于lidar应用开发 210

GC(四种类型的垃圾回收器)

GC分为四种: 1.串行垃圾回收器(Serial Garbage Collector) 2.并行垃圾回收器(Parallel Garbage Collector) 3.并发标记扫描垃圾回收器(CMS Garbage Collector) 4.G1垃圾回收器(G1 Garbage Collector) &nbs...

别抢我蓝buff 1546

uniapp - 实现免费OCR文字识别方案,用户上传图片后进行扫描识别获取图片上的文字,uniApp纯前端做图片OCR识别——无需服务器进行OCR识别插件(不需要依赖任何SDK或第三方API服务)

uniapp实现orc识别免费的插件识别不花钱,无需第三方OCR文字识别API,uniApp拍照或者选择图片免费识别,纯前端不需要服务器,Uniapp提取图片上的文字,本地ocr识别技术,uni-app图片OCR识别文本,uniapp有没有免费的ocr识别组件,uniapp前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)跨端无SDK方案:Uniapp实现OCR文字,离线OCR识别,uniapp tesseract.js实现文字识别,uniapp文字识别无需依赖sdk

🏆 前端领域优质创作者 4246

【性能测试】三种基本的GC算法

内存中的对象构成一棵树,当有效的内存被耗尽的时候,程序就会停止,做两件事,第一:标记,标记从树根可达的对象(途中水红色),第二:清除(清楚不可达的对象)。标记清除的时候有停止程序运行,如果不停止,此时如果存在新产生的对象,这个对象是树根可达的,但是没有被标记(标记已经完成了),会清除掉。 缺点:递归效率低性能低;释放空间不连续容易导致内存碎片;会停止整个程序运行;

m0_49428126的博客 1153

ICC2:使用analyze_lib_cell_placement检查lib cell的pass rate

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?在place之前需要使analyze_lib_cell_placement命令去检查lib cell在当前的site row/power plan/legalize设置的环境下能够正常place和legalize。下面分享一个脚本去报告pass rate低于2%的lib cell。

m0_61544122的博客 673

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1548

GC算法与种类

今天跟着一篇优快云的blog学习GC 垃圾回收器机制是由Garbage Collection来实现的。GC是后台的守护进程,它是低优先级进程,但是根据内存的使用情况动态的调整它的优先级,因此,它是内存低到一定程度的时候才会自动运行,所以回收时间不确定。 GC处理的数据主要在运行时数据区域的堆中(所有对象化的实例都在这里),当一个对象不再被引用时,就会回收这个引用 下面为GC算法: 引用计数法 简...

RikkaTheWorld 863

用 SAP S/4HANA Configure Predefined Custom Fields 玩转预定义自定义字段:从概念到实战

SAP预定义自定义字段配置指南:安全扩展业务模型的云原生方案 摘要: 本文系统介绍SAP S/4HANA Cloud中预定义自定义字段的配置方法,对比普通自定义字段与预定义字段的区别,阐述其技术特点与业务价值。重点解析"Configure Predefined Custom Fields"应用的核心功能,包括字段元数据配置、多语言支持、UI集成等能力,并通过业务伙伴扩展案例演示完整实施流程。文章指出预定义字段方案在云环境下的独特优势:既满足业务扩展需求,又能保证系统可升级性,是SaaS环

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 79

GC 算法与种类

相同点(1)三个算法都基于根搜索算法去判断一个对象是否应该被回收,而支撑根搜索算法可以正常工作的理论依据,就是语法中变量作用域的相关内容。(2)在GC线程开启时,或者说GC过程开始时,它们都要暂停应用程序(stop the world)。区别三种算法比较:效率:复制算法>标记-整理算法>标记-清除算法;内存整齐度:复制算法=标记-整理算法>标记-清除算法内存利用率:标记-整理算法=标记-清除算法>复制算法。

java领域分享 3110

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【JAVA秒会技术之玩搞定GC】GC算法与种类

GC算法与种类 (一)GC的概念         GC,指Ganbage Collection 垃圾回收器。GC的算法主要分为四类:引用计数法、标记清除、标记压缩、复制算法。下面将对这几种算法进行逐一说明。 (二)GC的算法——引用计数法     引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数

qq296398300的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

GC算法和种类

1.GC的概念 Garbage Collection垃圾收集 Java中,GC对象时堆空间和永久区 2.Garbage Collection算法 ①引用计数法 通过引用计算来回收垃圾 原理:对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1,只要对象A的引用计数器的值为0,则对象A就不可能再被使用,可以进行回收了。 上述从根对象(Gc...

huangwei18351的博客 2335

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jvmGC算法和GC种类

Parallel GC是一种多线程的垃圾回收器,它使用复制算法来回收新生代,使用标记-整理算法来回收老年代。Parallel GC适用于多核CPU和大内存的环境,它的优点是回收效率高,缺点是会占用较多的CPU资源。Serial GC是一种单线程的垃圾回收器,它使用复制算法来回收新生代,使用标记-整理算法来回收老年代。分代算法是根据对象的存活周期将堆内存划分为不同的区域,然后根据不同区域的特点使用不同的垃圾回收算法。Shenandoah GC是一种低停顿时间的垃圾回收器,它使用标记-清除算法来回收堆内存。

互联网知识分享 245
上一篇: (4)Bean的加载
下一篇: 垃圾收集器与内存分配
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值