2023年11月26日发(作者:)
JS中的内存泄漏和垃圾回收机制(标记清除,引⽤计数)
什么是内存泄漏?
程序的运⾏需要内存,只要程序提出要求,操作系统运⾏时就必须供给内存。
对于持续运⾏的服务进程,必须及时释放内存,否则,内存占⽤越来越⾼,轻则影响系统性能,重则导致进程崩溃。不再⽤到的内存,没有
及时释放,就叫做内存泄漏。
有些语⾔(⽐如c语⾔)必须⼿动释放内存,程序员负责内存管理。
这很⿇烦,所以⼤多数语⾔提供⾃动内存管理,减轻程序员的负担,这被称为"垃圾回收机制"。
代码回收规则如下:
1.全局变量不会被回收。
2.局部变量会被回收,也就是函数⼀旦运⾏完以后,函数内部的东西都会被销毁。
3.只要被另外⼀个作⽤域所引⽤就不会被回收 (闭包中引⽤的变量不会被回收)
必要性:由于字符串、对象和数组没有固定⼤⼩,所有当他们的⼤⼩已知时,才能对他们进⾏动态的存储分配。JavaScript程序每次创建字
符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再
⽤,否则,JavaScript的解释器将会消耗完系统中所有可⽤的内存,造成系统崩溃。
// 创建时必须为每个字符串对象数组等动态进⾏内存分配,来存储实体,最终⼀定要释放,否则若可⽤内存占满会造成系统崩溃
JavaScript的解释器可以检测到何时程序不再使⽤⼀个对象了,当他确定了⼀个对象是⽆⽤的时候,他就知道不再需要这个对象,可以把它
所占⽤的内存释放掉了。
例如:
var a="hello world";
var b="world";
var a=b;
//这时,会释放掉"hello world",释放内存以便再引⽤
垃圾回收的⽅法:标记清除、计数引⽤
标记清除
另⼀种不太常见的⽅法就是引⽤计数法,引⽤计数法的意思就是每个值被引⽤的次数,当声明了⼀个变量,并⽤⼀个引⽤类型的值赋值给改
变量,则这个值的引⽤次数为1,;相反的,如果包含了对这个值引⽤的变量⼜取得了另外⼀个值,则原先的引⽤值引⽤次数就减1,当这个
值的引⽤次数为0的时候,说明没有办法再访问这个值了,因此就把所占的内存给回收进来,这样垃圾收集器再次运⾏的时候,就会释放引


发布评论