垃圾回收
2022-03-17
816
垃圾回收机制
GC(Garbage Collection,垃圾回收)是一种内存自动管理机制, 垃圾回收器(Garbage Collector)可以自动回收分配给程序的已经不再使用的内存。
如果没有垃圾回收机制,及时清理不被引用的值,并释放相应的内存空间,将会消耗完系统中所有可用内存,造成系统崩溃。
垃圾回收机制的思路
清理掉内存中不再被引用的值,按照固定时间周期性的执行回收。
就是清理掉内存中没用的值,那么如何判断有没有用?
如果是局部变量,在函数调用结束后即是无用的,可以被回收掉;
而全局变量在浏览器卸载页面的时候才会消失。
GC算法
标记清除 (Mark Sweep)
优点是能够回收循环引用的对象。
给所有变量增加一个标记,如果是进入执行环境(比如声明变量),则标记为“进入环境”,如果是结束执行环境(比如执行完相关函数),则标记为“离开环境”;
去掉“进入环境”的变量标记以及被该变量所引用的变量标记(比如闭包);
还存在标记的变量即是需要被清理的变量。
标记整理(Mark Compact)
缺点是:移动对象位置,不会立即回收对象,回收的效率比较慢。
标记阶段的操作和Mark-Sweep一致。
清除阶段会先执行整理,移动对象位置,将存活的对象移动到一边,然后再清理边界外的内存。
引用计数(Reference Counting)
将资源(比如对象)的被引用次数保存起来,如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。
该方法的局限性:当出现循环引用时,互相引用的对象不会被回收。
内存泄漏
内存泄漏是指,应当被回收的对象没有被正常回收,导致内存占用越来越高。
内存泄漏会导致应用程序速度变慢、延时高、崩溃等问题。
内存泄露常见原因
- 创建全局变量,且没有手动回收。
- 事件监听器 / 定时器 / 闭包等未正常清理。
- 使用 JavaScript 对象来做缓存,且不设置过期策略和对象大小控制。
- 本文作者:JSZ
- 本文链接:blog.vampuck.com/2022/03/17/gc/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!
查看评论