• 浅谈垃圾回收机制


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

    解决:手动删除情况。

  • 相关阅读:
    Node.js、vue.js的使用
    windows配置环境变量
    http常见状态码及其解析
    AWS使用教程
    免费服务器集锦 免费服务器大全 免费使用服务器
    免费服务器AWS免费使用一年详细教程
    PHP实现RSA2加密
    dcoker安装redis
    ES,kibana通过nginx添加访问权限
    docker快速安装kibana
  • 原文地址:https://www.cnblogs.com/mikeCao/p/9271937.html
Copyright © 2020-2023  润新知