内存泄漏,垃圾回收机制

时间:2022-03-22 20:55:40

内存泄漏,垃圾回收机制


1.什么是内存泄漏?

通俗的讲,就是不再使用的内存,没有及时释放空间
有些编程语言需要程序员手动进行处理。譬如c语言的malloc(分配)和free(释放).


2.垃圾回收机制

内存泄漏的带来的问题是不容忽视的。必须对其进行相应的处理,否则会使宝贵的内存资源白白浪费掉。
垃圾回收机制就是针对内存泄漏而提出的解决方案
那么,如果要对闲置的已分配内存进行处理释放,首先要解决的问题就是如何才能知道内存不再需要使用了呢?

常见方式有两种

引用计数
在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。

标记清除(最常用)
当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
至于怎么标记有很多种方式,比如特殊位的反转、维护一个列表等, 原则上讲不能够释放进入环境的变量所占的内存,它们随时可能会被调用的到.
大部分浏览器都是使用这种方式进行垃圾回收,区别在于如何标记及垃圾回收间隔而已,只有低版本IE,又是IE。。。
需要注意的是,如果几次垃圾回收之后,内存的占用却越来越大,则需要通过查看内存的占用来解决。


补充知识点:

ES6中引入 WeakSet WeakMap (弱引用) 不计入垃圾回收机制