本文通过JavaScript说明了避免内存泄漏和内存管理的技术,非常实用。分享给大家参考。具体方法如下:
本文来自Google WebPerf(伦敦WebPerf集团),2014年8月26日。
一般来说,高效的JavaScript Web应用程序必须流畅、快速。任何与用户交互的应用都需要考虑如何保证内存的高效使用,因为如果消耗太多,页面就会崩溃,迫使用户重新加载。而你只能躲在角落里哭泣。
自动垃圾收集不能取代有效的内存管理,尤其是在大型和长时间运行的Web应用程序中。在本文中,我们将演示如何通过Chrome的DevTools有效地管理内存。
并学习如何解决性能问题,例如内存泄漏、频繁的垃圾收集暂停和整体内存扩展,这些问题确实会耗费您的精力。
Addy Osmani在他的PPT中展示了许多Chrome V8内存泄漏的例子:
1)删除对象的属性会降低对象的速度(消耗15倍的内存)
var o={ x : ' y ' };删除o.x//这时,o将成为一个慢对象o.x//var o={ x : ' y ' };o=null//应该是这样的。2)关闭
当闭包之外的变量被引入到闭包中时,当闭包结束时,对象不能被垃圾收集。
var a=function(){ var large str=new Array(1000000)。联接(' x ');return函数(){ return largeStr}}();3) DOM泄漏
当移除原始组件时,如果不移除子节点引用,则无法回收它。
var select=document . queryselector;var TreeRef=select(' # tree ');//在COM树中,leafRef是treef的子节点。var LeaveRef=select(' # leaf ');var body=select(' body ');body . remove child(TreeRef);//#tree无法返回,因为treeRef仍然存在。//Resolution : ref=null;//树还不能被回收,因为叶结果leafRef仍在leafRef=null中;//#tree现在可以发布了。4)计时器泄漏(计时器)
计时器也是发生内存泄漏的常见场所:
for(var I=0;我90000;I){ var buggyObject={ callagin: function(){ var ref=this;var val=setTimeout(function(){ ref . callague();}, 90000);} } buggyobject . callague();//虽然你想回收,但是计时器还在buggyObject=null}5)调试内存
Chrome自带的内存调试工具可以轻松检查内存使用情况和内存泄漏情况:
单击时间线-内存中的记录:
希望本文对javascript编程的学习有所帮助。