浅谈垃圾回收机制
Posted mikecao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈垃圾回收机制相关的知识,希望对你有一定的参考价值。
C/C++经典垃圾回收算法
1. 引用计数法:
每个对象计算指向它的指针数量
当有一个指针指向自己时数值加1
当删除一个指向自己的指针时计数减1
如果减为0,说明已经不存在指向该对象的指针了,所以可以安全销毁了。
2. 标记-清除算法
3. 标记-缩并算法
4. 节点拷贝算法
引用计数法能够平滑的进行垃圾回收,而不出现“停止”现象,经常出现于一些实时系统中,但它无法解决环形问题。
后面三种统称为跟踪垃圾回收,在每一次垃圾回收过程中,要遍历或者复制所有存活的对象,这是一个非常耗费时间和空间的工作。
一种好的解决方案就是对堆上的对象进行分区,对不同区域的对象使用不同的垃圾回收算法,分为年轻代(新生成的对象),老年代(经历了N次回收仍然存活的对象),持久代(用于存放静态文件,如Java类,方法等)
Lua的垃圾回收机制
1. 如何检测lua的编程产生的内存泄漏
a. 针对产生泄露的函数,先调用collectgarbage("count"), 取得最初的内存使用
b. 函数调用后,collectgarbage("collcet")进行收集,并使用collectgarage("count")在取得当前内存,最后记录两次的使用差。
c. 需要多次调用。
2. 如何避免lua应用中出现的内存使用过大的行为
a. 代码实现不出现泄露
b. 在测试中,其实还发现,Lua被分配的内存,其实并不会自动回收,所以,为了避免内存过大,应用运行时,可以需要定期调用collectgarbage("collcet")进行显示回收
JS的垃圾回收机制
JS具有自动的垃圾回收机制,垃圾回收器会按照固定的时间间隔周期性的执行。
最常用的垃圾回收方式就是标记清除
什么情况会引起内存泄漏:
1. 意外的全局变量引起的泄露
原因:全局变量,不会被回收
解决:使用严格模式
2. 闭包引起的内存泄露
原因:闭包可以维持函数内部局部变量,使其得不到释放
解决:将事件处理函数定义在外部,解除闭包。
4. 被遗忘的定时器或者回调
原因:定时器中有dom的引用,即使删除dom,定时器还在,所以内存中还是有dom
剞劂:手动删除定时器和dom
5.子元素在引用时引起内存泄露
解决:手动删除情况。
以上是关于浅谈垃圾回收机制的主要内容,如果未能解决你的问题,请参考以下文章