垃圾回收机制学习总结

article/2025/10/8 2:13:23

链接一篇讲的非常棒的文章

https://juejin.cn/post/6981588276356317214#heading-21

提出一些问题:方便后续回顾垃圾回收机制。

1、什么是垃圾回收机制?

GC 即 Garbage Collection ,程序工作过程中会产生很多 垃圾,这些垃圾是程序不用的内存或者是之前用过了,以后不会再用的内存空间,而 GC 就是负责回收垃圾的,他工作在引擎内部,这一套引擎执行操作就是 垃圾回收机制 了

2、为什么要进行垃圾回收?

JavaScript 的引用数据类型是保存在堆内存中的,然后在栈内存中保存一个对堆内存中实际对象的引用,所以,JavaScript 中对引用数据类型的操作都是操作对象的引用而不是实际的对象。可以简单理解为,栈内存中保存了一个地址。

举个例子

let a = {age : "555"
}a = [1,2,3]

首先我们声明了一个变量a ,它引用了对象{age : “555”},然后把变量重新赋值了一个数组对象,该变量变成了引用一个数组,他就和{age:“555”}没有关系了。没有了引用关系就是无用的对象,多了的话内存也会受不了,所以要进行垃圾回收。

3、垃圾应该怎么回收?

就是删除这些垃圾释放内存呗

4、回收策略有哪些?

标记清除法

引用计数法

5、标记清除算法的逻辑? 优点是什么?缺点是什么?

标记清除法算法逻辑:下面画了个大致的逻辑图
在这里插入图片描述
优点: 实现比较简单,打标记就两种情况

缺点:在清除之后,剩余的对象内存位置是不变的,会导致内存空间不连续,出现碎片化,就会牵扯到内存分配问题。如下图所示

粉色代表需要清理的对象,白色代表空闲内存,蓝色代表无需清理的内存。在粉色内存清除之后,发现内存空间不是连续的,是间断的
在这里插入图片描述
所以在我们下一次分配内存空间时,要怎么样找到合适的块儿呢?

1、first-fit: 找到大于等于size的块的立刻返回(速度和效率很快)
2、Best-fit:遍历整个空闲列表,返回大于等于size的最小分块(分配速率很慢)
3、worst-fit:遍历整个空闲列表,找到最大的分块,然后切成两部分,一部分size大小,并将该部分返回(会造成更多的碎片)

所以,标记清除算法有两个很明显的缺点1、导致内存空间碎片化。2、内存分配速度慢

怎么解决这些个缺点呢?
标记整理算法:她跟标记清除算法的区别只有一点,就是标记结束后,会将内存空间往左移动,这样剩下的空内存就全在右边了。

6、引用计数算法的逻辑?优点是什么?缺点是什么?
算法逻辑:
1、当声明了一个变量并且将一个引用类型赋值给该变量的时候这个值的引用次数就为 1
2、如果同一个值又被赋给另一个变量,那么引用数加 1
3、如果该变量的值被其他的值覆盖了,则引用次数减 1
4、当这个值的引用次数变为 0 的时候,说明没有变量在使用,这个值没法被访问了,回收空间,垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的内存

例子如下

let a = new Object() 	// 此对象的引用计数为 1(a引用)
let b = a 		// 此对象的引用计数是 2(a,b引用)
a = null  		// 此对象的引用计数为 1(b引用)
b = null 	 	// 此对象的引用计数为 0(无引用)
...			// GC 回收此对象

优点:清晰很多,引用计算在引用值为0时,就会被立即回收,而标记算法需要每隔一段时间进行一次

缺点:计数器占用位置很大,且没有上限会占用很多内存。无法解决循环引用的问题(最严重的BUG)

7、可达性是什么?不可达性是什么

可达性:以某种方式可以被访问或者使用的值就是可达性,否则为不可达性

8、分代收集算法?
即新生代垃圾回收算法加老生代垃圾回收算法,下面会详细说到

9、讲一下分代式垃圾回收?为什么需要分代式?V8对CG的优化是什么?

分代式机制把一些新、小、存活时间短的对象作为新生代采用一小块内存频率较高的快速清理,而一些大、老、存活时间长的对象作为老生代,使其很少接受检查,新老生代的回收机制及频率是不同的,可以说此机制的出现很大程度提高了垃圾回收机制的效率

10、讲一下新生代垃圾回收和老生代垃圾回收?

新生代垃圾回收: 即复制算法

新生代活动空间只有1-8M

(1)、将堆内存一分为二,一个为使用区,一个为空闲区,新加入的对象都会被放入使用区。当使用区快被写满时,进行垃圾清理操作。
(2)、对使用区的活动对象做标记
(3)、将使用区的所有对象复制到空闲区并进行排序
(4)、把空闲区的非活动对象的占用空间清理掉。然后空闲区变为使用区,使用区变为空闲区。

当一个对象经过多次复制后依然存货,它会被认为是生命周期较长的对象,随后被移动到老生代中,如果一个对象复制到空闲区时,空闲空间占用超过了25%,这个对象会直接被晋升到老生代中(因为翻转占比过大会影响后续内存分配)。

老生代垃圾回收
就是标记清除算法,V8还使用了标记整理法解决标记清除算法产生的内存碎片问题。

11、增量标记与懒性清理、三色标记法(暂停与恢复),写屏障(增量中修改引用)?

**增量标记:**就是讲一次GC标记的过程。分成了很多小步,每执行完一小步就让应用逻辑执行一会儿,这样交替多次后完成一轮GC标记。

**懒性清理:**增量标记完成之后,懒性清理就开始。我们没有必要立即清理内存,可以将清理过程稍微延迟一下,先执行javascript脚本代码,逐一进行清理,直到所有非活动内容清理完,再进行增量标记

三色标记法:

(1)、执行一次完整的GC标记前,垃圾回收机制会将所有的数据置为白色。
(2)、从一组根对象开始,将这组跟对象标记为灰色并推入到标记工作表中,当回收器从标记工作表中弹出对象并访问它的引用对象时,将其自身由灰色转变成黑色,并将自身的下一个引用对象转为灰色。
(3)、一直往下走直到没有可标记的灰色的对象时,就是无可达,剩下的白色对象都是无法到达等待回收的


http://chatgpt.dhexx.cn/article/K0436H2n.shtml

相关文章

垃圾回收机制

1.常见误区 1.垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收。 (垃圾回收再jvm中优先级相当相当低。当程序运行时,至少会有两个线程开启启动,一个是我们的主线程,一个时垃圾回收线程,垃圾回…

Python垃圾回收机制详解

最近想了解一下Python的内存回收机制,特此来标记一下 平时在写代码的时候,关注的是写出能实现业务逻辑的代码,因为现在计算机的内存也比较宽裕,所以写程序的时候也就没怎么考虑垃圾回收这一方面的知识。俗话说,出来混总…

java垃圾回收机制介绍

一、垃圾回收机制 java中引入了一种独特的内存回收机制解决了过去在c中令人头疼的内存管理问题,使得java程序员在编写程序的时候不必考虑内存的问题。 由于这个机制的存在,java的对象不再有"作用域"的概念,只有对象的引用才有&quo…

java基础:简述垃圾回收机制

1.什么是“垃圾回收”机制? 当程序创建对象,数组等引用类型实体时,系统会在堆内存中为之分配一块内存区,对象就保存在内存区中,当内存不再被任何引用变量引用时,这块内存就变成了垃圾,等待垃圾…

Java的垃圾回收机制介绍

1、java的语言框架 (1)CPU->操作系统内核->应用层框架->JVM(java虚拟机)->Java字节码->Java源代码 (2)java是解释型语言,嵌入式常用的C/C是编译型语言,简单来说:编译型语言只需要编译一次就可以执行&am…

JVM-垃圾回收机制

JVM-垃圾回收机制 引言1、什么是垃圾2、为什么需要GC3、Java中的垃圾回收 垃圾回收相关算法垃圾判断算法标记阶段:引用计数算法标记阶段:可达性分析算法 垃圾清除算法清除阶段:标记-清除算法清除阶段:标记-整理算法清除阶段&#…

Java的垃圾回收机制是什么?

说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。 顾名思义,垃圾回收就是…

GC垃圾回收机制

GC概述 垃圾回收是一种自动的存储管理机制。当一些被占用的内存不再需要时,将其释放,以让出空间,这种存储管理机制,就叫做垃圾回收机制。可以很大程度减轻程序员的负担和错误。 通常在堆(heap) 和 元空间(metaspace)需要GC机制。…

python垃圾回收机制

python垃圾回收机制 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露&a…

Java 垃圾回收机制原理

最近做一个ETL的项目模块,经常由于查询数据量比较大用消息中间件MQ时引起了内存溢出的报错。做完后没事研究了一下JVM和垃圾回收的相关知识点。 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c程序员最头疼的…

五、垃圾回收机制

一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉&…

一、垃圾回收机制

. 一、Java内存结构1、Java堆(Java Heap)2、Java虚拟机栈(Java Virtual Machine Stacks)3、本地方法栈(Native Method Stack)4、方法区(Method Area)5、执行引擎 二、垃圾回收机制1、…

垃圾回收机制浅聊

对于任何一门语言而言,在运行过程中都会创建许多对象,继而需要为这些对象分配内存地址,当这些对象不需要使用的时候,需要释放其占用的内存地址,以供新的对象使用。关于对象内存释放的这一机制就叫做垃圾回收机制&#…

图解Java 垃圾回收机制

摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区。关于对象分配内存问题,笔者的博文《JVM …

深入理解 Java 垃圾回收机制

一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,java中的额对象不在有“作用域”…

JVM垃圾回收机制

文章目录 JVM垃圾回收机制一、垃圾回收原理二、对象被标记为垃圾方法1. 引用计数器2. 可达性分析 三、垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代回收算法 JVM垃圾回收机制 一、垃圾回收原理 GC (Garbage Collection:即垃圾回收)的基本原理&#xff1a…

Java垃圾回收(GC)机制

一、为什么要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。 哪些内存需要…

JVM:常用的四种垃圾回收机制

1.CMS (Concurrent Mark Sweep):并行 标记清除 老年代垃圾回收机制 cms是一个基于标记-清除 算法的综合多种算法的老年代垃圾回收器 适用场景:重视服务器响应速度,要求系统停顿时间最短。 这里要说明下,这是一个老年代算法&…

什么是垃圾回收机制(超详细)

垃圾回收机制 1.垃圾回收机制(Garbage Collction)简称GC,是JavaScript中使用的内存管理系统的基本组部分,是为了防止内存泄漏 2.JavaScript是在创建变量(对象、字符串等)时自动进行了分配内存,并…

深入理解JVM—垃圾回收机制

一、前言 明确垃圾收集器关注的部分:堆和方法区。着重学习如何确定哪些垃圾需要回收、垃圾回收算法以及GC触发条件。 二、如何确定哪些垃圾需要回收 1、引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一&…