js具备自动垃圾回收机制,换句话说,执行环境会管理代码执行过程当中使用的内存。chrome
执行环境会找出那些再也不继续使用的变量,而后释放其占用的内存。浏览器
当变量进入环境时,就将这个变量标记为“进入环境”,而当变量离开环境时,则将其标记为“离开环境”。函数
标记变量方式看具体的实现,可使用一个“进入环境”的变量列表和一个“离开环境”的变量列表来跟踪哪一个变量发生了变化。post
使用过标记清除的浏览器有IE,Firefox,chrome。性能
这是一种不太常见的垃圾回收的策略,它就是跟踪每个值被引用的次数。spa
当声明了一个变量a并将一个引用类型值({name:'cc'})赋给该变量时,则这个值的引用次数就是1,若是a({name:'cc'})又赋给另外一个变量b,则该值的引用次数加1。反之,若是a赋值{name:'xx'},则{name:'cc'}这个值的引用次数减1。当{name:'cc'}这个值的引用的次数变为0时,则说明没有办法再访问{name:'cc'}这个值了,于是能够将其占用的内存空间回收。这样,当垃圾回收器工做的时候,{name:'cc'}这个值占用的内存空间就会被回收。code
这种方式曾今被Netscape Navigator 3.0使用过,可是有一个严重问题:循环引用。blog
function circleUseProbem(){ let objectA = new Object() let objectB = new Object() objectA.someOtherObject = objectB objectB.anotherObject = objectA }
执行这个函数后,由于这两个引用值的引用次数永远不会为0,垃圾回收器永远不会回收它们占用的内存空间。内存
由于js垃圾回收器是每隔一个周期就执行一次垃圾回收。ci
若是为变量分配的内存数量不大的话,那么垃圾回收器的回收工做量就不大。可是,当垃圾回收器的工做量过大的时候,就极可能会出现卡顿的状况。
谢谢阅读!