内存泄露

xiaoxiao2021-02-28  116

内存泄露

程序运行时,操作系统会为其分配运行所需要的内存,如定义变量等。当程序中某一部分变量不会再被用到,该变量所用到的内存会被回收。有些高级语言像C语言不会自动回收,需要手动释放内存(free)。但javascript可以自动回收内存,这就是javascript的垃圾回收机制。

当不会再用到的内存无法被释放,就是内存泄露。

垃圾回收机制

javascript的自动垃圾回收机制有两种:标记清除和引用计数 垃圾回收的目的是回收不用的变量占用的内存。 1. 标记清除 《javascript高级程序设计 第三版》介绍标记清除是最常用的垃圾收集方式,当变量进入环境时,就将其标记为“进入环境”。无法清除进入环境的变量所占用的内存。当变量离开环境时,将其标记为“离开环境”。

var globalI = "global" function add() { var localI = "local" console.log(globalI) console.log(localI) } add()

javascript垃圾回收器会为所有变量添加标记, 然后取消进入环境的变量的标记。 上述环境中,当函数执行时,垃圾回收器将localI和globalI标记为进入环境。当函数执行完毕时,垃圾回收器重新标记全部变量,然后取消环境内变量的标记,即globalI的标记被取消,localI存在标记,被回收。 2. 引用计数 引用计数是跟踪每个值被引用的次数。当声明了一个变量并将一个引用类型值 赋给该变量时,则这个值的引用次数就是 1,如果该引用类型又被赋值给其他变量,则这个值的引用次数加1,如果指向该值的变量被赋予了其它的值,那么引用次数减1。非引用类型的值次数不会增加,因为变量赋值时实际上是新开了一块内存把值复制进去。 当一个值的引用次数为0时,垃圾收集器的下次执行会将其回收。

转载请注明原文地址: https://www.6miu.com/read-52820.html

最新回复(0)