浅谈垃圾回收机制

简介: 浅谈垃圾回收机制

前言:


JavaScript的垃圾回收机制是为了防止内存泄漏的,所谓的内存泄漏是指当已经不需要某块内存时这块内存还存在着,而垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

举个例子:我写了一个函数,在这个函数里面我声明了一个局部变量,那么当这个函数运行完了其实这个变量我们就不需要了,我们不会在乎这个变量还存不存在,反正我们已经用完了。那么如果这个变量我们实实在在的不用了但是它却不能被回收,为什么不能被回收呢?因为内存泄漏了,下一篇文章我会详细聊聊内存泄漏的问题。

1.标记清除(主要)


先明确一个点,是谁在回收,即,谁是垃圾回收的主体?答案是JavaScript。

有两种垃圾回收机制,标记清除和引用计数,先说说标记清除。

当变量进入执行环境的时候,比如说函数声明一个变量,那么这个时候变量被标记为“进入环境”,当函数执行结束后,变量被标记为“离开环境”,也就是说函数运行完了,这个变量也就被清理了。

然后,对于JavaScript来说,它的执行是,给内存中中的所有变量打上标记(可理解为我要删除得有个名单),先除去正在运行的变量,可理解为这个函数正在执行中,还有就是闭包,可理解为这个变量正在被引用(使用),除了这两个情况,其他的就会被回收。

image.png

2.引用计数(次要)


这个方式很简单,意思是说我要跟踪记录这个变量的引用次数,当它变成0的时候就被清理。

具体的规则如下:

比方说我声明一个变量,将一个引用类型(如对象)赋值给该变量的时候这个值的引用次数加一,如果这个变量的值变成另外一个,那么这个引用次数减一,当这个值的引用次数为0的时候,说明没有变量被使用了,于是这个值就被回收掉了

3.一些注意的点


BOM和DOM是通过引用计数回收垃圾的,也就是说只要涉及BOM和DOM就会出现循环引用的问题

相关文章
|
1月前
|
算法 Java
JVM垃圾回收机制
JVM垃圾回收机制
22 0
|
1月前
|
Java 程序员
探讨JVM垃圾回收机制与内存泄漏
探讨JVM垃圾回收机制与内存泄漏
|
1月前
|
存储 缓存 算法
JVM的垃圾回收机制
JVM的垃圾回收机制
|
1月前
|
人工智能 Java 数据库连接
【C#】浅谈C#中垃圾回收机制
【C#】浅谈C#中垃圾回收机制
|
1月前
|
算法 Java
垃圾回收机制
垃圾回收是自动内存管理机制,用于检测和回收不再使用的内存资源,防止泄漏和浪费。主要算法包括:标记-清除、引用计数(难以处理循环引用)、分代回收(基于对象生命周期)、增量回收(减少应用停顿时间)和并发回收(同时执行回收和应用)。不同语言和环境选择不同策略,垃圾回收性能直接影响程序内存管理和执行效率。
|
1月前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
1月前
|
算法 Java PHP
JVM 的垃圾回收机制以及垃圾回收算法的详解
JVM 的垃圾回收机制以及垃圾回收算法的详解
20 0
|
1月前
|
存储 算法 Java
了解Java内存管理与垃圾回收机制
了解Java内存管理与垃圾回收机制
23 0
|
7月前
|
算法 Java 对象存储
深入理解JVM系列教程(04) - 垃圾回收机制(二) - 垃圾回收算法
深入理解JVM系列教程(04) - 垃圾回收机制(二) - 垃圾回收算法
151 0
|
9月前
|
存储 算法 Java
一文学会JVM垃圾回收器详解:串行回收,新生代内存管理内存分配
新生代内存管理包含了内存的分配和回收,这与新生代内存布局密切相关。 新生代被划分为3个空间:Eden、From和To空间。 这3个空间的作用如下: 1)Eden:仅用于应用程序对象分配;GC工作线程不会在该空间进行对象分配。 2)From:用于GC工作线程在执行垃圾回收时,在前一轮垃圾回收后活跃对象的存储。在特殊情况下,From空间也可以用于应用程序对象的分配(这是JVM在实现对象分配时的一种优化),但GC工作线程不会在该空间进行对象分配。 3)To:用于在GC工作线程执行垃圾回收时,存储本轮垃圾回收过程中活跃的对象。垃圾回收过程将Eden空间和From空间中的活跃对象放入To空间。