zoukankan      html  css  js  c++  java
  • 浅谈垃圾回收机制

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

    解决:手动删除情况。

  • 相关阅读:
    通过AI识图判断图片是否为小票
    orcl 定时器
    防止表单重复提交常规方法
    代码规范案例(ssh分页)
    jquery的ajax提交时“加载中”提示的处理方法
    利用JS弹出层实现简单的动态提示“正在加载中,请稍等...”
    jquery 排序table的列
    Java多线程与网络编程综合使用
    大型Oracle数据库设计方案(精华)
    20155307 2016-2017-2 《Java程序设计》第10周学习总结
  • 原文地址:https://www.cnblogs.com/mikeCao/p/9271937.html
Copyright © 2011-2022 走看看