内存问题的实际解决过程
问题情况:
1.页面经常延迟,卡顿,说明可能存在代码瞬间产生了大量的内存占用,导致?GC?过于频繁。
2. 页面使用时一直觉得不舒服,说明出现了内存膨胀,也就是程序申请的内存大小超过了设备承受范围。。
2.网页越看越卡,说明内存泄漏。
问题监控:
浏览器任务管理器 shift + Esc 唤醒,可以看到 JS 内存使用情况,括号中的值为所有可达对象占用的内存。
TimeLine
内存快照
代码优化
测试性能需要大量的数据演示,可通过 https://jsperf.com 在线测试?;蛘?JsBench
慎用全局变量:查找效率低,不会被 GC? 掉,容易被局部变量污染。
缓存全局变量:把无法避免的全局变量使用 ,缓存到局部。
通过原型对象添加附加方法
避免闭包的内存泄漏:如 图6.1 当 document.getElementById 时已经进行一次引用,然后又被 el 引用。 所以当这个 DOM 几点被删除时,因为 el 的引用,?document.getElementById 不会被 GC 清除,因为它还存在一层 el 引用。 所以造成内存泄漏。 这时候我们把 el 在代码中释放掉即可。
避免属性访问方法的使用:以内 JS 中可以直接对对象内部属性进行增删改查,所以在上边添加一个方法就显得很浪费。尽管这样很 ‘面向对象’。
for 循环的优化:结束条件使用 len 而不是 arr.length ,避免每一次循环都要进行计算。
根据数据结构选择最优的循环方法。
节点添加的优化:因为节点添加伴随回流和重绘,所以尽量集中添加,把多个要添加的节点,放到一个大节点内添加,避免多次渲染。
减少层级:程序最好扁平化。层级深了会出各种问题。
减少作用连查找层级:全局变量在局部大量使用时,把它在局部定义一下。速度会快,空间会浪费,但是如果外部没有引用的话。使用后会销毁,空间会回收。所以也就不会浪费空间。
减少数据读取次数:读取就会访问就会耗时。提前缓存,缩短访问路径。
事件委托:减少内存占用,减少时间注册。