美文网首页
前端内存泄漏之回收番

前端内存泄漏之回收番

作者: Yubble | 来源:发表于2018-11-11 13:37 被阅读0次

        写着写着前端浏览器的内存泄漏,我竟然被百度琳琅满目的博文给带跑偏了,竟然又追看了各种语言的垃圾回收机制。发现自己的知识储备真是贫瘠呀,怪不得面试老是没自信呢。

        搜罗了博文之后发现,垃圾回收机制在之前系统级编程语言里(c||c++)是不存在的,程序员必须自己来控制内存管理,内存的申请与释放,稍有不慎内存的泄漏和溢出是家常便饭,后果不堪设想。

        所以当后来开发出的新语言(php,python,java),都集成了自动的内存管理,也就是程序员在内存申请之后不用去考虑内存的释放。

        那么javascript这个优秀且全能的语言当然也有自己的垃圾回收机制了,不过不同的javascript引擎有不同的垃圾回收机制,目前javascript的主流运行平台就是各大浏览器和node了,我们主要先说说浏览器。


        各大浏览器采用的垃圾回收机制主要分为两种:

        1,标记清除

        这种机制是最常见的,它的大体思路是,当变量进入了执行环境(比如在函数中创建了它),它就被标记为了“进入环境”,成为了这个环境的活动对象,此时会给这个变量分配部分内存,但等到这个变量离开了执行环境(此时函数已经执行完毕),它就变成了死对象,等到浏览器发现了之后就会连同整个执行环境被销毁。

        举个栗子喵:

        function env() {

            var name = 'Yubble'

            console.log(name + '最好了,哼')

        }

        env()    // 这里打个debug    // 运行到这一行的时候,env函数开启了自己的小周天,我们现在就跳进env里面去看,飞~

        好啦各位看官,我们现在已经进入了给env分配的堆空间中(大家克服一下,想象一下)

        var name = 'Yubble'    // 此时这个标量进入了执行环境,被激活车活动对象了

        cconsole.log(name + '最好了,哼')    // 然后又说了一句Yubble最帅,哼😆

        就这样,env的执行结束了,浏览器里的内存管理员问他:“你还有用吗?”,env茫然的摇了摇头,于是生命到了尽头~

        等到了 env() 的下一行,他就被浏览器里带着墨镜的黑衣人整体带走了....

        看了上面的一系列虐心剧是不是忽然有点明白了,为什么闭包可能会在某些早期浏览器中引起内存泄漏,是的,关键就在于内存管理员说的那句“你还有用吗?”,闭包的一大功能就是将函数中的变量保存下来供后续代码使用...

        2,引用计数

        这种垃圾回收策略我们也提一下子吧,谁让红宝书都将它讲解了呢。它的工作原理在于跟踪记录每个值被引用的次数(被引用肯定是指引用类型咯,基础的5种类型也不会造成内存泄漏的)。

        当我们把一个引用类型的地址赋值给变量时,这个地址的引用次数就是1,此时同一个地址又被赋值给另一个变量,它的引用次数加1。

        当我们把被赋值的变量给赋予了另外一个值,此时引用次数减一。(我靠多绕啊,这样浏览器内存清的掉才怪呢,性能也高不到哪儿去吧--来自一个菜鸡的心声)

        语言总是很苍白的,我们用代码来举例

        function count() {

            var a = {}    //    此时新建了几个对象,它的引用计数为0

            var b = a    //    呐,这个时候a对象就被引用了一次,引用次数1

            var c = a    //    a对象又被引用啦,它已经被引用两次啦,引用次数2

            b = null    //    此时b被清空了,所以a的引用对象少了一个,引用次数1

        }

        但是如果我们对象相互引用怎么弄嘞,比如这样:

        function count() {

            var a = {}

            var b = {}

            a.child = b

            b.child = a

        }

        如果要是在引用计数的策略下这两个对象就似乎形成了闭环,永远都不会释放对方。

        所以在早期某些浏览器中,我们如果频繁调用count可能就会引起内存泄漏。


        这次学习引荐了“js红宝书”以及“js晋级篇-前端内存泄漏”,如果各位看官想要一起讨论diss一下内存泄漏的触发原因,请浏览在下另一篇博文,前端内存泄漏之形成篇😄。再次跪谢各位看官指教~

相关文章

  • 前端内存泄漏之回收番

    写着写着前端浏览器的内存泄漏,我竟然被百度琳琅满目的博文给带跑偏了,竟然又追看了各种语言的垃圾回收机制。发...

  • 记一次面试

    内存泄漏和内存溢出 概念 内存泄漏:垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。 内存溢出:...

  • 前端内存泄漏之形成番

    前几天我们的项目临上线出现了让人措手不及的Bug,特么的内存泄漏了。在一顿猛如虎的操作之后终于将这只小蛔虫...

  • 性能优化 - 相关概念

    1. 内存泄漏和内存抖动 内存泄漏:GC,垃圾回收器,在内存吃紧时候回收内存时,无法回收某一块不再使用的区域...

  • Android如何打造高质量的应用?( 三)

    内存泄漏内存泄漏简单来说就是没有回收不再使用的内存,排查和解决内存泄漏也是内存优化无法避开的工作之一。很多内存泄漏...

  • 性能优化- UI渲染和布局适配

    1.内存泄漏和内存抖动内存泄漏: GC在内存吃紧去回收内存的时候,无法回收某-块不再使用的内存。随着时间的推移会导...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • 内存优化(二)如何避免内存泄漏

    一、不同生命周期导致的内存泄漏 前面有分析了内存泄漏的原因,本该被回收的对象被占用,得不到回收便会内存泄漏。总归到...

  • Android常见问题之内存泄漏

    一、定义 内存泄漏是指:应该被GC回收的对象无法被回收,这个对象会引发内存泄漏。 二、危害 1、引发内存溢出;2、...

  • 浏览器的内存泄漏场景、监控以及分析

    内存泄漏 Q:什么是内存泄漏? 字面上的意思,申请的内存没有及时回收掉,被泄漏了 Q:为什么会发生内存泄漏? 虽然...

网友评论

      本文标题:前端内存泄漏之回收番

      本文链接:https://www.haomeiwen.com/subject/kbvnxqtx.html