GC—垃圾回收机制
来源:互联网 发布:cacti for windows 编辑:程序博客网 时间:2024/05/14 18:31
JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存。
原理:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。
不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后再函数中使用这些变量,直至函数结束(闭包中由于内部函数的原因,外部函数并不能算是结束)
function fn1() { var obj = {name: 'hanzichi', age: 10};}function fn2() { var obj = {name:'hanzichi', age: 10}; return obj;}var a = fn1();var b = fn2();
首先定义了两个function,分别叫做fn1和fn2,当fn1被调用时,进入fn1的环境,会开辟一块内存存放对象{name: ‘hanzichi’, age: 10},而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。
垃圾回收器必须知道哪个变量有用,哪个变量没用,对于不再有用的变量打上标记,以备将来回收。用于标记无用的策略有很多,常见的有两种方式。
标记清除
这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。至于怎么标记有很多种方式,比如特殊位的反转、维护一个列表等,这些并不重要,重要的是使用什么策略,原则上讲不能够释放进入环境的变量所占的内存,它们随时可能会被调用的到。
function test(){ var a = 10 ; //被标记 ,进入环境 var b = 20 ; //被标记 ,进入环境}test(); //执行完毕 之后 a、b又被标离开环境,被回收。
垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。
引用计数
引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
什么时候触发垃圾回收
IE6的垃圾回收是根据内存分配量运行的,当环境中存在256个变量、4096个对象、64k的字符串任意一种情况的时候就会触发垃圾回收器工作。但是如果环境中就是有这么多变量等一直存在,现在脚本如此复杂,很正常,那么结果就是垃圾回收器一直在工作。微软在IE7中做了调整,触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临街条件翻倍,如果回收的内存高于85%,说明大部分内存早就该清理了,这时候把触发条件置回。这样就使垃圾回收工作职能了很多。
- GC—垃圾回收机制
- GC----垃圾回收机制
- gc 垃圾回收机制
- GC垃圾回收机制
- GC 垃圾回收机制
- GC(垃圾回收机制)
- JVM-垃圾回收机制(GC)
- JAVA gc垃圾回收机制
- Java垃圾回收机制----GC
- JAVA 垃圾回收机制GC
- 【.net】 GC 垃圾回收机制
- JVM GC 垃圾回收机制
- 2.3GC垃圾回收机制
- JVM 垃圾回收机制(GC)
- java垃圾回收机制GC
- JAVA gc垃圾回收机制
- JVM GC垃圾回收机制
- JAVA gc垃圾回收机制
- 拓扑排序(ZOJ 3780,Paint the Grid Again)
- Activity和Service的生命周期详解
- 有关tomcat的一些小总结(一)
- 分布式服务化系统一致性的“最佳实干”
- 使用tp5开发微信公众号(配置失败)填坑
- GC—垃圾回收机制
- 关于项目导入第三方静态库可能遇到的问题(1)
- 九.Scala 循环
- Unity 协程运行时的监控和优化
- 实现 一个圆环进度条的Demo---渣渣级别
- 关于学习Hadoop中未总结的资料
- opencv 图像操作
- 关于windows系统编译openssl遇到的ms\do_ms不是内部或外部命令的解决方法
- 读c++ primer有感----局部和全局变量,extern,static