首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度揭秘垃圾回收底层,这次让你彻底弄懂她(中)

深度揭秘垃圾回收底层,这次让你彻底弄懂她(中)

在深度揭秘垃圾回收底层的前两篇文章中,我们讨论了回收算法的基本工作原理和标记清除算法的实现。现在,让我们继续深入,学习更多关于垃圾回收器的细节及其实际应用。

回收类型

垃圾回收器主要有三种类型:标记清除器 (Mark-Sweep)标记压缩器 (Mark-Compact)拷贝回收器 (Copying)

1. 标记清除器 (Mark-Sweep)

标记清除器是最基本的垃圾回收算法,其工作流程如下:

  1. 从根节点开始,找到所有可达的对象;
  2. 将可达对象标记为“活着”;
  3. 去除那些标记为“死亡”的对象;
  4. 更新根节点,以便在下一次循环中不再考虑这些对象。

2. 标记压缩器 (Mark-Compact)

标记压缩器在标记清除器的最后一个阶段会进行压缩处理。它通过重新分配所有可达对象来消除内存碎片:

  1. 对象按照年龄排序;
  2. 保留最小年龄的对象;
  3. 再次遍历整个堆,将“活着”的对象与其他对象相邻。

3. 拷贝回收器 (Copying)

拷贝回收器首先将活着的对象复制到新的内存位置,然后回收现有对象占用的空间:

  1. 从根节点开始,找到可达对象;
  2. 将每个可达对象复制到另一个内存区域;
  3. 清除原来的内存区域;
  4. 更新根节点,以便在下一次循环中不再考虑这些对象。

优点与缺陷

  • 回收速度快:所有垃圾回收器在大部分编程语言中都表现良好。
  • 资源低需求:算法通常需要的内存分配和垃圾回收成本相对较低。
  • 处理短期对象较快:对于需要短期使用的生命周期短的对象,传统垃圾回收器表现良好。

然而,传统垃圾回收算法仍然面临一些挑战:

  • 标记时间较长:标记清除器在遍历堆的过程中可能需要较长的时间来进行可达性分析。
  • 存活对象重新分配:在标记复制和移动过程中,可能存在大量“活着”的对象迁移。
  • 并发问题:在多线程运行过程中(特别是在多核编程语言中),垃圾回收器可能产生竞争和阻塞。

腾讯云相关产品介绍

腾讯云提供以下几种垃圾回收解决方案:

总结

本文介绍了垃圾回收器的三种主要类型 - 标记清除器、标记压缩器和拷贝回收器。我们重点关注了标记压缩器的实现细节,介绍了回收器的优点与缺陷,以及腾讯云相关的垃圾回收产品和解决方案。了解这些底层原理将有助于开发者设计高效的应用程序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深度揭秘垃圾回收底层这次彻底弄懂

就类加载器这一条来说,除非像特意设计过的 OSGI 等可以替换类加载器的场景,不然基本上回收不了。 而垃圾收集回报率高的是堆内存的回收,因此我们重点关注堆的垃圾收集。 如何判断对象已成垃圾?...既然是垃圾收集,我们得先判断哪些对象是垃圾,然后再看看何时清理,如何清理。 常见的垃圾回收策略分为两种:一种是直接回收,即引用计数;另一种是间接回收,即追踪式回收(可达性分析)。...清除阶段:扫描堆的对象,将为标记的对象作为垃圾回收。 基本上就是下图所示这个过程: ?...对 CPU缓存亲和性高,因为从根开始遍历一个节点,是深度优先遍历,把关联的对象都找到,然后内存分配在相近的地方。...这其实就是标记过程没有暂停 mutator 而导致的,但这也是为了 GC 减少对应用程序运行的影响。

35020

公司新来的女实习生问我什么是闭包?

因为它的JavaScript引擎使用的垃圾回收算法是引用计数法,对于循环引用将会导致GC(下文会介绍)无法回收垃圾。...,居然还不知道垃圾回收机制,赶快来补习一下!...垃圾回收也就是GC(Garbage Collection) GC把程序不用的内存空间视为垃圾,找到它们并且将它们回收程序员可以再次利用这部分空间。...引用计数法 这种方法引入了计数器的概念,通过计数器来表示对象的“人气指数”,也就是有多少个程序引用了这个对象。当计数器(引用数)为0时,垃圾立刻被回收。 优点: 1.可以立即回收垃圾。...垃圾回收的算法与实现 https://book.douban.com/subject/26821357/ 微信搜索【前端食堂】的前端食堂,记得按时吃饭。

44820

摊牌了!

下面是文章目录,建议收藏转发后再看‍‍‍‍‍ 分布式学习路线 第一讲:拜占庭将军问题 必须先把拜占庭将军问题弄懂,这篇我用三国杀卡牌游戏中的四种身份牌来讲解了拜占庭将军问题。...《诸葛亮 VS 庞统,拿下分布式 Paxos》 第四讲:Raft 算法 Raft 算法其实比较好理解,但是直接描述出来会人云里雾里,所以我借助了动图,用动图模拟 Raft 算法的选举过程,轻松易懂。...《浅析「扣减库存」的方案设计》 《故事|黑熊精 揭秘「补偿事务」》 《48 张图 | 手摸手教你微服务的性能监控、压测和调优》 《别人用2小时画的架构图,我只用了10分钟!》...并发编程 《干货 | 45张图庖丁解牛18种 Queue,知道几种》 《5000字 | 24张图带你彻底理解Java的21种锁》 《全网最细 | 21张图带你领略集合的线程不安全》 《Java并发必知必会第三弹...《PHP 垃圾回收机制》 《这个月被「视频播放」坑惨了,曝光八大坑》 《阿里终面:怎么用 UDP 实现 TCP?》 《Go语言 记者招待会》 《女神节表白:因一个分号被拒!》

94630

新版阿里神级“高并发”教程《基础+实战+源码+面试+架构》

这次彻底懂了! synchronized原理 为何在32位多核CPU_上执行long型变量的写操作会出现诡异的Bug问题? 如何使用互斥锁解决多线程的原子性问题?...如何使用互斥锁解决多线程的原子性问题 高并发环境下诡异的加锁问题(加的锁未必安全) 高并发场景下创建多少线程才合适?一条公式帮你搞定! ! 终于弄懂为什么局部变量是线程安全的了! !...这些理论必须掌握! ! 如何实现亿级流量下的分布式限流?这些算法必须掌握! ! 亿级流量场景下如何为HTTP接口限流?看完我懂了! ! 亿级流量场景下如何实现分布式限流?看完我彻底懂了! !...线程与线程池 线程的执行顺序 Java的Callable和Future SimpleDateFormat类的线程安全问题 深度解析ThreadPoolExecutor类源码 深度解析线程池中重要的顶层接口和抽象类...类的源代码 深入理解Thread类源码 AQS的CountDownL atch、Semaphore与CyclicBarrier ReentrantLock Threadl ocal学会了这些,也能和面试官扯皮了

71120

闪存时代来临,如何才能不落伍?

这三者彻底解放了分布式系统的生产力。通俗一点说也就是:网络快了、盘容量大了、盘速度快了。...比如:SLC/MLC/TLC/QLC、3D NAND、快慢页、上下页、局部/全局磨损均衡、擦1写0、垃圾回收、Device/Host BasedFTL、元数据保护机制、页面映射、NVMe、PCIE/SATA...购买后在社群页面可以看到美女微信号二维码,加美女好友,会拉加入本书专属微信群,向作者和编辑提问,确保所有与本书内容相关的问题都能得到回答。...SSD基础知识包括:SSD与HDD的比较、SSD的发展历史、产品形态、整体架构和基本工作原理; 模块介绍包括: FTL闪存转换层介绍:作为SSD固件的核心部分,FTL实现了例如映射管理,磨损均衡,垃圾回收...SSD存储介质:闪存 3.1 闪存物理结构 3.2 闪存实战指南 3.3 闪存特性 3.4 闪存数据完整性 第4章 SSD核心技术:FTL 4.1FTL综述 4.2 映射管理 4.3 垃圾回收

1.2K20

美团 2面:为什么 G1能够替代 CMS回收器?看完这篇就懂了!

hi,你好,我是猿java在 《肝了一周,彻底弄懂了 CMS收集器原理,这个轮子造的真值! ...》这篇文章, 详细地分析了 CMS收集器,刚好这两天看了一道美团 2面的题目:G1 为什么能替代 CMS收集器?借此机会,把 G1收集器以及它和 CMS的对比一并彻底讲解。...根据垃圾回收的类型,收集集包含不同种类的区域:Young-Only阶段:在这个阶段,收集集只包含年轻代的区域,以及那些可能被回收的大对象区域中的对象。...Young-only phase:这里的“Young-only”是指垃圾收集器只会回收年轻代,该阶段主要完成回收过程的 年轻代回收(Young GC) 和 老年代并发标记周期(Concurrent Marking...本文同时分析了 G1为什么能替代 CMS回收器,最核心是设计思想以及算法,其他的一些功能也多少有影响。为了更好的阅读本文,建议先阅读《肝了一周,彻底弄懂了 CMS收集器原理,这个轮子造的真值!

16010

我是一个垃圾

新生代图 “我的大多数伙伴都在Minor GC死去了,我们大部分都是朝生夕死的,对吗?”我有点感伤。 他点点头,“能活过一轮GC已经很幸运了,看看你头顶的标记。”...但是Serial乖张的性格帝国的很多大臣不满,因为Serial在进行垃圾回收时,必须暂停其他所有的用户线程,直到他收集结束。这也是当时所有用户线程定在原地动弹不得的原因。...我有点不理解,在标记垃圾的过程还在运行用户线程,这不就等于打扫房间的同时还扔垃圾吗?这啥时候能打扫完啊。...我尽量我的措辞婉转一点。 大叔有气无力地笑了笑:“这一轮不会,因为我是在并发标记过程中被设置为null的,已经是在CMS标记之后了,所以我就成“浮动垃圾”,会在下一轮GC中被回收。...旁边同样被打了标记的对象对着CMS破口大骂:“回收我们你们很爽是嘛?洗好脖子给老子等着吧,G1早晚革了的命!” 于是我眼睁睁地看着CMS走到跟前,把那家伙扔了出去。 然后走到我身边。

24510

百名开发者的48小时:高精度智能盘库、猜拳的Pepper,艰难的智能垃圾分类和AutoNLP探索

本次挑战赛聚焦生活垃圾,利用深度学习图像分类模型的构建,实现(上海)四大类别垃圾图片的精准识别,包括湿垃圾、干垃圾、有害垃圾和可回收垃圾。...随后,介绍了自己的分类器设计、特征提取模型以及推断策略。和其他选手不同的是,在整个比赛过程并没有爬取额外的数据。 ? 从最终结果来看,验证集结果明显好于测试集。...评委也针对的算法设计提出了自己的看法:不要为了算法而算法,可以考虑将常识添加到分类设计。...另一位评委赛后告诉机器之心,他们发现一些参赛选手在算法处理上有一些很有意思的地方,这位 skype 选手的处理方式比较特别,印象比较深刻。...与之前仅用摄像头的方案不同,这次他们去掉了过滤算法。 Galatea(北光科技)的 AGV 行驶 软银 Pepper 机器人:来玩「石头剪刀布」吧 ?

60120

CleanMyMac系统软件有什么新功能?

CleanMyMac X是一款知名的专业Mac系统软件工具,拥有一键智能扫描Mac系统缓存、删除系统垃圾和恶意软件,并 Mac 恢复高效运行。...等进度走完了,CleanMyMac 会告诉这次系统清理一共释放了多少 GB 的硬盘空间。...CleanMyMac 会把很久没打开过的且体积很大的文件列出来(可按时间/体积等多个规则排序)确认没用后手动删除,还会列出苹果电脑上的软件和插件,不想要的话一键卸载。这样既清理硬盘又不会丢文件。...如下图所示作为 macOS 平台上知名度最高的垃圾清理应用之一,CleanMyMac 可以高效扫描清理系统垃圾、搜索无用大体积文件、删除无用重复图片 (清理照片库)、帮你彻底卸载各种 APP 应用和游戏...从Mac 的每个角落找出垃圾并将它们全部删除从系统扫描出恶意软件并将其删除保持应用程序更新并帮助卸载不需要的应用程序提高 Mac 的性能并加速整个系统内置助手为您提供个性化清洁提示总的来说,cleanmymac

1.1K30

201215-03-19—cocos2dx内存管理–具体解释「建议收藏」

内存的管理我们一般有两种方式,引用计数和垃圾回收。 我们cocos2dx採用的就是引用计数,而非常火的java就是垃圾回收。...引用计数,垃圾回收具体解释: 引用计数:通过给每一个对象维护一个引用计数器,记录该对象当前被引用的次数。 当对象添加一次引用时,计数器加一:而失去一次引用时,计数器减一;当计数为0时。...垃圾回收:他通过引入一种自己主动的内存回收期,试图将程序猿从复杂的内存管理任务全然解放出来。他会自己主动跟踪每个个对象的全部引用,以便找到正在使用的对象,然后是房企与不再须要的对象。...垃圾回收期一般是作为一个单独的低级别的线程执行的,在不可预知的情况下对内存堆已经死亡的或者长时间没有使用过的对象进行清除和回收 。...表示这个精灵我们要继续用,自己主动释放池就会在将引用计数减一后为一,引擎就会知道在creat这个精灵之后还在用,我就无论了,他继续活着,我还是要清理自己主动释放池。

43820

58岁女子身患绝症,却在元宇宙实现临终愿望:VR大峡谷之旅

---- 新智元报道   编辑:拉燕 桃子 【新智元导读】元宇宙听过最让人动容的事是什么?一名身患绝症的女子还有一个心愿尚未了,那就是去看看美国神秘大峡谷。所幸的是,VR帮实现了!...Polson向她的女儿和女婿讲述了这次奇妙的旅程。...彻底被震撼到了。看看这儿,看看那儿,怎么也看不够。 「然后我们还在边儿上逗看看左边!看看右边!...这是我们唯一能给在病床上的做的事了。」 毫无疑问,这次奇妙的体验Polson更开心了,躺在病床上也是笑容常伴。 不光是因为终于看到了大峡谷的风光,更关键的是,的家人也都陪在她身边。...小扎曾表示,可以用于元宇宙的虚拟对象,使我们与之交互时获得触觉感受。 在触觉方面,Meta还揭秘了其秘密研发七年的项目气动触觉手套。 这种触觉手套可以通过气囊体验到抓取虚拟物体时的真实触感。

19220

JVM 是怎么把“送”出去的内存又“要”回来的

接着他就朝着 乙 走过来,他还没说话,乙 先开口:“刚跟我大姐说的我听见了,看这么的行不行,先去找别人,如果找完别人之后位置还不够,来找老妹儿,老妹儿给你这个位置 ” ,服务员一看 乙 是个...软 妹子,就答应走开了。...GC 就嗝屁了,来收拾就得,管你喝完没喝完。...,即可逃离这次垃圾回收。...方法区垃圾收集的“性价比”通常也是比较低的:在Java堆,尤其是在新生代,对常规应用进行一次垃圾收集通常可以回收70%至99%的内存空间,相比之下,方法区回收囿于苛刻的判定条件,其区域垃圾收集的回收成果往往远低于此

44210

java向上取整和向下取整,万字长文!

spring的@autowired的作用 mybatis和hibernate的区别 C,C++了解吗 (不了解) python用过吗 (没有,我用过matlab(笑)) Java类加载器哪几种 Java垃圾回收器...我先说了垃圾回收算法–垃圾收集器–比较CMS和G1。...给我讲一讲。 理了下思路,准备开始讲了,面试官我在IDE上把源码打开讲。 当时差点ConCurrentHashMap都没拼出来。(一紧张,以为是Cur开头的。。。)...面试官我多参加开源的项目。 面完一度觉得自己凉了,没有高水平的代码展示,也没读过spring的源码。我的朋友也觉得这次希望不大。之后问了一面的面试官面试结果,没想到过了。...后来面试官说了,他其实更想我能从底层去说,如果能从底层CPU开始说,那他会非常认可。 反问 面试官很真诚的给了一些学习建议。 他我加强学习的广度和深度。 先加强广度,多学一些技术知识。

75510

小六六的阿里面试之旅

就是在JVM里面的标记位不同的区别),然后是lock这点我也没答上,这个应该说他的几个实现,然后跟面试官聊聊他的底层实现原理,但是我这个是目前真的不是很熟悉,因为平时不用,可能前面走马观花的看了,但是这次面试是突击...但是他我说底层原来的时候,我又好像说错了,我把他和voliate搞混了,我竟然说是因为有一个内存总线,真的是尴尬呀,能够说其他的本地线程无效,在Cpu层面(这就是那种靠背的结果,哎),其实CAS的底层是一个...lock指令来实现的再多核系统,反正就这样扯。。...,然后聊到底层,又不会(还是太菜),然后聊线程池,然后聊线程池的创建,线程池的运行过程,然后他的优化啥的,然后聊了一下,感觉我也没啥深度,就终于不再跟我聊多线程了,(目前为止,就聊了2个东西 redis...面试官 我看你对JVM调优有了解,我们聊聊JVM吧,然后因为垃圾回收算法,垃圾回收器。

28620

Java虚拟机的Heap监狱

碰巧我会对Heap的Java 对象做垃圾回收,这个“堆”总是我联想到垃圾堆。...说起垃圾回收,这实在是一个大负担,原因很简单,那些写Java程序的人类只管把对象给new出来,扔到Heap , 但是从来不管把他delete 掉, 删掉这些对象的责任就落到了我的头上,我不严格管理怎么行...JVM老大说确实是不放心,人家底层的Socket都是C语言写的, 关注的是物理内存的地址, 垃圾回收的时候把Java对象在什么Eden, Survivor, 老年代之间挪来挪去,对象的地址也会变来变去...想想也是这个理儿,有得必有失,程序员不用管理内存,但是底层还得和内存打交道,并且还额外多了一道工序:Copy 。...完了,这块内存我是彻底管不了了。 老大看出我情绪不对,安慰道: “这个buffer也是个Java对象啊, 就在你的Heap存着,只不过它保存了那128M内存的地址而已。” ? ? 这还差不多 !

42320

.NET面试题解析(06)-GC与内存管理

的基本工作原理就是遍历托管堆的对象,标记哪些被使用对象(那些没人使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。...垃圾回收的基本流程包含以下三个关键步骤: ① 标记 先假设所有对象都是垃圾,根据应用程序根指针Root遍历堆上的每一个引用对象,生成可达对象图,对于还在使用的对象(可达对象)进行标记(其实就是在对象同步索引块开启一个标示位...的作用就是用来释放非托管资源,由GC来执行回收,因此可以保证非托管资源可以被释放。...是就对了,如果想彻底搞清楚,没有捷径,不要偷懒,还是去看书吧!...的基本工作原理就是遍历托管堆的对象,标记哪些被使用对象(哪些没人使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。 5.

54210

Java垃圾回收的细节

本人对于垃圾回收机制以前也就知道java的垃圾回收器是自动回收垃圾的,有这么回事,知道有finalize和system这两个方法而已,别人都跟我说,知道java虚拟机有垃圾回收这回事就可以了,不用操心这个的...下面说个小故事:有一个小土豪家里请了一个保姆每天打扫卫生,但不知道这个保姆会什么时候来; java的垃圾回收器就相当于我们请的这个保姆,它会清理垃圾无法控制他什么时候来清理。...GC Roots 不指向了的对象就搜索要被回收的对象       任何对象被垃圾回收时都会至少经历两次标记的过程。 GC Roots不指向该对象时,标记一次,标记这次时该对象还没有真正被回收! ...,很少使用了; 标记整理:标记出所有要回收的对象,然后所有存活着的对象往一端移动,然后直接清理另外一端的垃圾;   垃圾回收的过程也进行了内存的碎片 清理工作;                 要是有对内存方面还不是特别理解的小伙伴可以换一个方式来理解一下...3.随着程序的访问量增长,程序的底层是肯定要优化的,内存空间也是很重要的一个地方~

46120

Java垃圾回收的细节

本人对于垃圾回收机制以前也就知道java的垃圾回收器是自动回收垃圾的,有这么回事,知道有finalize和system这两个方法而已,别人都跟我说,知道java虚拟机有垃圾回收这回事就可以了,不用操心这个的...下面说个小故事:有一个小土豪家里请了一个保姆每天打扫卫生,但不知道这个保姆会什么时候来; java的垃圾回收器就相当于我们请的这个保姆,它会清理垃圾无法控制他什么时候来清理。...GC Roots 不指向了的对象就搜索要被回收的对象       任何对象被垃圾回收时都会至少经历两次标记的过程。 GC Roots不指向该对象时,标记一次,标记这次时该对象还没有真正被回收! ...,很少使用了; 标记整理:标记出所有要回收的对象,然后所有存活着的对象往一端移动,然后直接清理另外一端的垃圾;   垃圾回收的过程也进行了内存的碎片 清理工作;                 要是有对内存方面还不是特别理解的小伙伴可以换一个方式来理解一下...3.随着程序的访问量增长,程序的底层是肯定要优化的,内存空间也是很重要的一个地方~

902120

作为一名程序员,谁没跳过槽,“6”招“空降”大厂

所以进入一个新企业,彻底地放低自己的身架(不是“身价”,“身价”只能靠结果来证明的) 第二招、多做自我反省。...他如又曲解,就再如此说!总之要多从自身找原因:一切都是的错——是自己水平“不够”才导致了对方误解、曲解、歪解,才导致了别人做错!如此,就算对方想说的“不是”,他也找不到“理由”!...Java 线程池的核心属性以及处理流程 Java 并发包原理、Synchronized关键字、锁 线程的生命周期 JVM类加载机制 JVM内存模型 JVM分代以及垃圾回收机制 Spring Bean 容器生命周期...b.项目理解一般会画个架构图,然后从架构图出发,得清楚每个模块的作用,每个框架的原理以及与其他框架的区别。是否有能拿得出手的项目,并对其原理了如指掌,很大程度关系到你能否通过这次面试。...c.项目思考深度在这一个层次上考核的是对开源框架的思考深度,这些框架到底好不好,好在哪里,不好在哪里,有什么可以改进的地方。

43930
领券