Javascript 进阶 2-8 记忆体存放与释放

http://img2.58codes.com/2024/20121770uP1t2ZzbLu.png

这个章节要来讲述 Javascript 的回收机制,也就式记忆体释放的情况。

http://img2.58codes.com/2024/20121770O8XC63dxaC.png

假设现在有两个 function 的执行堆叠如上图,在 sayHi 的执行堆叠结束后,会释放掉他所占的记忆体空间

http://img2.58codes.com/2024/20121770OAmR3CwlSB.png

同理,当 doSomthing 的执行堆叠结束后,也会释放掉他所占的记忆体空间

http://img2.58codes.com/2024/20121770AXB1c280nK.png

最后只剩下 全域环境 的记忆体占比

而记忆体释放的条件在 MDN 的文件上写到

http://img2.58codes.com/2024/20121770pxWR7flv2d.png

那么我们来看一下实例

    // 随机产生一串很长的字串    function randomString (length) {        var result = '',            characters = 'AZQCFWVEMBRLKMUJMIKPO',            charactersLength = characters.length;        for (var i = 0; i < length; i++){            result += characters.charAt(Math.floor(Math.random()*charactersLength));        }        return result;    }    // 範例程式码1    var demoData = [];    function getData () {        for (let i = 0; i < 1000; i++) {            demoData.push(randomString(5000));        }    }    getData();    console.log(demoData);

执行之后呢,我们可以到 Console 查看结果

http://img2.58codes.com/2024/20121770KHu7ulkX5U.png

并且可以透过 Memory 的工具,点选 Take heap snapshot 来看看佔用了多少记忆体

http://img2.58codes.com/2024/20121770Ca4oDQWnCh.png

可以看到这样的结果,总共佔用了 6.4MB 。

那么我们如果把 getData(); 注解掉的话~

http://img2.58codes.com/2024/20121770uxFc6R4arW.png

console.log就会是空阵列,没错。 那记忆体呢?

http://img2.58codes.com/2024/20121770xU8xk0bcFD.png

变成只有 1.6MB。节省了很多的空间喔!

那么如果换成下面的程式码执行看看呢?

    function randomString (length) {        var result = '',            characters = 'AZQCFWVEMBRLKMUJMIKPO',            charactersLength = characters.length;        for (var i = 0; i < length; i++){            result += characters.charAt(Math.floor(Math.random()*charactersLength));        }        return result;    }        // 範例程式码2    function getData () {        var demoData = [];        for (let i = 0; i < 1000; i++) {            demoData.push(randomString(5000));        }        console.log(demoData);    }

http://img2.58codes.com/2024/20121770QDlCzePqWM.png

http://img2.58codes.com/2024/20121770RLmXfRCrGU.png

可以看到记忆体占比又回到 6.4MB ,这样的写法差异在于我们把 demoData 宣告在 getData 的 function 里面。

这时候,如果把 Console 的暂存清空的话,

http://img2.58codes.com/2024/20121770SlJlEcm6DD.png

http://img2.58codes.com/2024/20121770VURHoe0bGy.png

会发现记忆体又回到1.6MB,这同时也证明了,chrome中的console.log也会佔记忆体。

以上就是 Javascript 的记忆体存放与释放的观念

希望对大家有帮助 汪汪


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章