浅谈垃圾回收机制

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.子元素在引用时引起内存泄露

解决:手动删除情况。

猜你喜欢

转载自www.cnblogs.com/mikeCao/p/9271937.html