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

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

垃圾回收底层揭秘(上篇)

背景与目标

垃圾回收(Garbage Collection,简称GC)是编程语言和操作系统中自动管理和清除无用数据的一项功能。尽管我们可能无需直接涉及GC实现细节,了解相关概念和如何利用GC优化程序性能是非常重要的。本问答计划从低层角度分析GC技术,帮助您全面理解GC如何运作。

GC分类

1. 引用计数(Reference Counting)

引用计数是最简单的垃圾回收技术,它计算对象被引用次数。每当一个对象被引入程序并增加一个引用时,引用计数会增加;相反,每当引用被删除或超出作用域时,引用计数会减少。当引用计数为0时,该对象将被回收。然而,引用计数具有以下两个缺点:

  1. 循环引用导致的计数不准。
  2. 不支持垃圾回收循环引用的情况。

2. 根搜索(Root Set)

许多Garbage Collection技术采用根搜索方法来扫描并识别可达对象和不可达对象。这种方法涉及找到所有引用的对象。分为如下类型:

  1. 标记-清除(Mark-Sweep):首先将整个可达对象集合标记为可达,然后将不可达对象变成垃圾,最后清除它们。
  2. 标记-压缩(Mark-Compact):遍历整个可达对象集合并移动未使用的对象到内存的起点。
  3. 分代收集(Generational Collection):将对象分为3个代,新生的对象属于第一代,经过一定周期后逐渐被移到更高代。较低代的对象被回收的可能性更高。

3. 增量收集(Incremental Collection)

这种方法不重新启动应用程序进行垃圾回收,而是持续监控内存使用情况并通过增量的方式回收垃圾对象。

特点与优劣

引用计数

  • 优点:实现简单、对内存模型友好。
  • 缺点:难以处理循环引用问题、内存碎片化较严重。

根搜索

  • 优点:能处理复杂的内存引用结构、实现简单。
  • 缺点:内存占用较高、存在一定性能波动。

增量收集(仅针对分代收集)

  • 优点:降低应用程序停顿时间。
  • 缺点:实现相对复杂,需要对内存堆进行更细致的监控与维护。

注意事项

  1. GC可能会导致应用程序性能波动。
  2. 合理设置垃圾回收策略以满足程序需求。
  3. 尽量避免内存泄漏,以降低GC负担。
  4. 使用性能测试工具验证和优化GC效果。

问题:

简述什么是Garbage Collector(GC)和它的主要功能?

要求:答案中不能提及任何云计算品牌商,直接给出答案内容,并逻辑连贯

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

相关·内容

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

本来还打算分析有关 JVM 的各垃圾回收器,但是文章太长了,所以分两篇写,下篇再发。 本篇整理的 GC 内容不限于 JVM 但大体还是偏 JVM,如果讲具体的实现默认指的是 HotSpot。...既然是垃圾收集,我们得先判断哪些对象是垃圾,然后再看看何时清理,如何清理。 常见的垃圾回收策略分为两种:一种是直接回收,即引用计数;另一种是间接回收,即追踪式回收(可达性分析)。...清除阶段:扫描堆中的对象,将为标记的对象作为垃圾回收。 基本就是下图所示这个过程: ?...这其实就是标记过程中没有暂停 mutator 而导致的,但这也是为了 GC 减少对应用程序运行的影响。...可达性分析基本是现代垃圾回收的核心选择,但是由于需要统一回收比较耗时,容易影响应用的正常运行。

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

    这次彻底懂了! synchronized原理 为何在32位多核CPU_执行long型变量的写操作会出现诡异的Bug问题? 如何使用互斥锁解决多线程的原子性问题?...看完这篇我彻底懂了! ! 一文搞懂PV、UV、W、IP及其关系与计算 优化加锁方式时竟然死锁了! !...如何使用互斥锁解决多线程的原子性问题 高并发环境下诡异的加锁问题(加的锁未必安全) 高并发场景下创建多少线程才合适?一条公式帮你搞定! ! 终于弄懂为什么局部变量是线程安全的了! !...这些理论必须掌握! ! 如何实现亿级流量下的分布式限流?这些算法必须掌握! ! 亿级流量场景下如何为HTTP接口限流?看完我懂了! ! 亿级流量场景下如何实现分布式限流?看完我彻底懂了! !...回收策略和算法? 面试官:性能优化有哪些衡量指标?需要注意什么? 面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer! 如何设计一个支撑高并发大流量的系统?

    76420

    摊牌了!

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

    97930

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

    这三者彻底解放了分布式系统的生产力。通俗一点说也就是:网络快了、盘容量大了、盘速度快了。...比如: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

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

    CleanMyMac X是一款知名的专业Mac系统软件工具,拥有一键智能扫描Mac系统缓存、删除系统垃圾和恶意软件,并 Mac 恢复高效运行。...等进度走完了,CleanMyMac 会告诉这次系统清理一共释放了多少 GB 的硬盘空间。...CleanMyMac 会把很久没打开过的且体积很大的文件列出来(可按时间/体积等多个规则排序)确认没用后手动删除,还会列出苹果电脑的软件和插件,不想要的话一键卸载。这样既清理硬盘又不会丢文件。...如下图所示作为 macOS 平台上知名度最高的垃圾清理应用之一,CleanMyMac 可以高效扫描清理系统垃圾、搜索无用大体积文件、删除无用重复图片 (清理照片库)、帮你彻底卸载各种 APP 应用和游戏...为什么多年来仍旧稳坐Mac系统清洁工具首位,与其的强大的功能,人性化的设计有很大的关系,目前市场上还没有出现可以替代它的工具,在这里我会给4星。

    1.1K30

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

    本次挑战赛聚焦生活垃圾,利用深度学习图像分类模型的构建,实现(上海)四大类别垃圾图片的精准识别,包括湿垃圾、干垃圾、有害垃圾和可回收垃圾。...评委进一步解释道,上海将垃圾分为四大类别,其实并没有大多数人想的那么深奥,本质也符合生活常识:原则,人吃的东西,剩下来就是湿垃圾;可回收垃圾无非就是玻璃、塑料、金属、纸张和衣服;至于干垃圾,就是一个兜底的类别...另一位评委赛后告诉机器之心,他们发现一些参赛选手在算法处理上有一些很有意思的地方,这位 skype 选手的处理方式比较特别,印象比较深刻。...不一会儿,就可以听见系统识别出这是可回收垃圾,轰隆一声,本来水平的铁板向可回收垃圾一侧倾斜,易拉罐掉了进去。 如果我扔进去的是一袋未加分类的垃圾呢?...Pepper 一双萌萌的大眼睛盯着,视线还能跟随你的移动,有时,还真的有点心跳的感觉。

    64020

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

    hi,你好,我是猿java在 《肝了一周,彻底弄懂了 CMS收集器原理,这个轮子造的真值! ...借此机会,把 G1收集器以及它和 CMS的对比一并彻底讲解。...02 堆内存结构和以往的垃圾收集器不一样,G1尽管依然保留了年轻代和老年代的概念, 但是它们已经变成了一个逻辑的概念,G1的堆内存被切分成若干个大小(1M ~ 32M)相同且不连续的 Region,包括...4.1.1 回收过程回收过程是指 G1回收过程中会经历哪些具体的步骤,从全局看,包括年轻代回收(Young GC),老年代并发标记周期(Concurrent Marking Cycle),混合回收(Mixed...本文同时分析了 G1为什么能替代 CMS回收器,最核心是设计思想以及算法,其他的一些功能也多少有影响。为了更好的阅读本文,建议先阅读《肝了一周,彻底弄懂了 CMS收集器原理,这个轮子造的真值!

    71011

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

    Polson向她的女儿和女婿讲述了这次奇妙的旅程。...彻底被震撼到了。看看这儿,看看那儿,怎么也看不够。 「然后我们还在边儿看看左边!看看右边!...这是我们唯一能给在病床上的做的事了。」 毫无疑问,这次奇妙的体验Polson更开心了,躺在病床上也是笑容常伴。 不光是因为终于看到了大峡谷的风光,更关键的是,的家人也都陪在她身边。...在触觉方面,Meta还揭秘了其秘密研发七年的项目气动触觉手套。 这种触觉手套可以通过气囊体验到抓取虚拟物体时的真实触感。...研究者开发出搭载在Meta Quest 2头显的硬件模块,能够用户在VR中体验喝水、刷牙、和亲吻的触感。

    22420

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

    因为cocos2dx我们的使用c++写的,所以内存管理就是一个绕只是去的坎,这个不懂内存仅仅懂业务逻辑的话,还玩什么c++,今天看了半天这个东西,事实本质是理解的,可是就是有一个过不去的坎,最终在今天晚上搞定了...内存的管理我们一般有两种方式,引用计数和垃圾回收。 我们cocos2dx採用的就是引用计数,而非常火的java就是垃圾回收。...垃圾回收:他通过引入一种自己主动的内存回收期,试图将程序猿从复杂的内存管理任务中全然解放出来。他会自己主动跟踪每个个对象的全部引用,以便找到正在使用的对象,然后是房企与不再须要的对象。...垃圾回收期一般是作为一个单独的低级别的线程执行的,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用过的对象进行清除和回收 。...表示这个精灵我们要继续用,自己主动释放池就会在将引用计数减一后为一,引擎就会知道在creat这个精灵之后还在用,我就无论了,他继续活着,我还是要清理自己主动释放池。

    50520

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

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

    78110

    我是一个垃圾

    回收者的脚步声越来越清晰,我竭力锁紧身体自己别那么引人注目,尽管气喘吁吁,但我仍然压抑住自己的呼吸。 终归是藏不住的,但是多活个几毫秒也是好的,我们都这么想。 因为回收者是来杀我们的。...听说C帝国的朋友都是他们的主人亲自送他们最后一程,而我的主人,甚至不愿意看我最后一眼,还研究了很多方法,我被自动回收。 我问他,为什么这么对我?他的回答我崩溃。 “回收你,与你何干!”...但是Serial乖张的性格帝国的很多大臣不满,因为Serial在进行垃圾回收时,必须暂停其他所有的用户线程,直到他收集结束。这也是当时所有用户线程定在原地动弹不得的原因。...我尽量我的措辞婉转一点。 大叔有气无力地笑了笑:“这一轮不会,因为我是在并发标记过程中被设置为null的,已经是在CMS标记之后了,所以我就成“浮动垃圾”,会在下一轮GC中被回收。...旁边同样被打了标记的对象对着CMS破口大骂:“回收我们你们很爽是嘛?洗好脖子给老子等着吧,G1早晚革了的命!” 于是我眼睁睁地看着CMS走到跟前,把那家伙扔了出去。 然后走到我身边。

    27210

    小六六的阿里面试之旅

    说实话,能有机会面一下阿里对我来说帮助确实有蛮多,至少我知道了自己的不足在哪,都说面试造火箭,上班拧螺丝。但就算是如此,为了生存,也只有不停的学习,唯有光头,才能更强。...就是在JVM里面的标记位不同的区别),然后是lock这点我也没答,这个应该说他的几个实现,然后跟面试官聊聊他的底层实现原理,但是我这个是目前真的不是很熟悉,因为平时不用,可能前面走马观花的看了,但是这次面试是突击...但是他我说底层原来的时候,我又好像说错了,我把他和voliate搞混了,我竟然说是因为有一个内存总线,真的是尴尬呀,能够说其他的本地线程无效,在Cpu层面(这就是那种靠背的结果,哎),其实CAS的底层是一个...,然后聊到底层,又不会(还是太菜),然后聊线程池,然后聊线程池的创建,线程池的运行过程,然后他的优化啥的,然后聊了一下,感觉我也没啥深度,就终于不再跟我聊多线程了,(目前为止,就聊了2个东西 redis...面试官 我看你对JVM调优有了解,我们聊聊JVM吧,然后因为垃圾回收算法,垃圾回收器。

    31120

    Java虚拟机的Heap监狱

    碰巧我会对Heap中的Java 对象做垃圾回收,这个“堆”总是我联想到垃圾堆。...实际我还会做动态的年龄判断,这里按下不表。 可能会觉得奇怪,为什么在新生代里分出了Eden, Survivor1, Survivor2这样奇怪的区域?...后来人类发现,大部分在新生代的对象都活不了多长时间,基本一次垃圾回收就删除得差不多了。...JVM老大说确实是不放心,人家底层的Socket都是C语言写的, 关注的是物理内存的地址, 垃圾回收的时候把Java对象在什么Eden, Survivor, 老年代之间挪来挪去,对象的地址也会变来变去...想想也是这个理儿,有得必有失,程序员不用管理内存,但是底层还得和内存打交道,并且还额外多了一道工序:Copy 。

    43620

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

    所以进入一个新企业,彻底地放低自己的身架(不是“身价”,“身价”只能靠结果来证明的) 第二招、多做自我反省。...工作的问题,只能是一种同事间的相互影响!只能通过沟通、了解、商量及讨论去解决!而不能夹进自己的个人喜好——没有理由去要求别人来依的个性去工作,所以有什么理由生气?...Java 线程池的核心属性以及处理流程 Java 并发包原理、Synchronized关键字、锁 线程的生命周期 JVM类加载机制 JVM内存模型 JVM分代以及垃圾回收机制 Spring Bean 容器生命周期...b.项目理解一般会画个架构图,然后从架构图出发,得清楚每个模块的作用,每个框架的原理以及与其他框架的区别。是否有能拿得出手的项目,并对其原理了如指掌,很大程度关系到你能否通过这次面试。...c.项目思考深度在这一个层次考核的是对开源框架的思考深度,这些框架到底好不好,好在哪里,不好在哪里,有什么可以改进的地方。

    46530

    2018秋招面经-网易Java面试经历

    问题列表 我看你简历写到了熟悉JVM虚拟机运行机制,能给我介绍一下Java虚拟机运行时数据区域吗?...接着从引用计数法开始讲,后来我说虚拟机中一般都不会用这个垃圾回收算法了,然后面试官打断了我我直接从可达性分析开始介绍。...在这里要强烈安利一本关于垃圾回收算法的书,是一个日本作家写的,R大在知乎也安利过这本书。...(在这里要感谢@zpauly去狼厂实习的时候没把这本书带走而是留在了寝室,我正好前两天翻了翻,还了解了一下保守式垃圾回收和增量式垃圾回收) 《垃圾回收的算法与实现》 阅读过某些主流WEB框架的源码...一开始我以为面试官直接我说底层实现机制,稍微讲了下JDK动态代码实现方式我就开始讲它的源码了,后来面试官说没让我说源码,只是看下我知不知道怎么用。

    56410

    深入解析Java垃圾回收机制引入垃圾回收哪些内存需要回收?如何回收为什么需要分代收集?JVM的分代分代垃圾收集过程详述

    引入垃圾回收 哪些内存需要回收?...每一个栈帧中分配多少内存基本是在类结构确定下来时就已知的(尽管在运行期会由JIT编译器 进行一些优化,但在本章基于概念模型的讨论中,大体可以认为是编译期可知的),因此这几个区域的内存分配和回收都具备确定性...image.png 所有堆中的对象都会被扫描一遍,以此来确定回收的对象,所以这通常会是一个相对比较耗时的过程 Step 2: Normal Deletion 垃圾收集器会清除掉一步标记出来的那些需要回收的对象区域...类似于 “你妈妈在给你打扫房间的时候,肯定也会老老实实地在椅子或者房间外待着,如果一边打扫,一边乱扔纸屑,这房间还能打扫完?” 老年代 老年代用来存储那些存活时间较长的对象。...但是,不同的是,在这次垃圾回收中,存活对象和之前的survivor中的对象都会被移动到s1中。

    59310

    前端基础进阶(五):JavaScript 闭包详细图解

    因此本文的目的就在于,能够清晰明了的把闭包说清楚,读者朋友们看了之后,就把闭包给彻底学会了,而不是似懂非懂。...闭包 对于有一点 JavaScript 使用经验但从未真正理解闭包概念的人来说,理解闭包可以看作是某种意义的重生,突破闭包的瓶颈可以使功力大增。 闭包是一种特殊的对象。 它由两部分组成。...在基础进阶(一)[1]中,我总结了JavaScript的垃圾回收机制。...JavaScript拥有自动的垃圾回收机制,关于垃圾回收机制,有一个重要的行为,那就是,当一个值,在内存中失去引用时,垃圾回收机制会根据特殊的算法找到它,并将其回收,释放内存。...其占用的内存空间很快就会被垃圾回收器释放。可是闭包的存在,会阻止这一过程。 先来一个简单的例子。

    71531
    领券