🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 前言 网站系统,均由浏览器负责渲染显示,用户通过操作浏览器中网站视图功能,js脚本响应,并向服务器发送请求,更新相应数据。 ## 1. 浏览器渲染 浏览器渲染流程: ![像素管道](https://img.kancloud.cn/d2/39/d239eca3d5d82b8ef39b331a22fbb1db_816x106.png) * JavaScript:js实现动画效果、dom元素操作等 * Style:确定每个DOM元素应该应用什么CSS规则。 * Layout:计算DOM元素大小及确定位置。当某一个dom元素位置发送变化引起其他元素发生变化,这个过程叫`reflow` * Paint:在多个图层上绘制DOM元素的文字、颜色、图像等。当只修改颜色、字体等不影响它周围或内部布局的属性,则会引起浏览器`repaint` * Composite:按正确顺序合并图层并显示到屏幕上 ## 2. 浏览器内存 ### 2.1 内存生命周期 分配内存 -> 使用内存 -> 释放内存 ### 2.2 js内存使用周期 * 分配内存: 在声明变量、对象等时候,系统会自动为它们分配内存 * 使用内存:在使用变量、对象的时候,会读取或写入内存 * 内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存 ### 2.3 js垃圾回收机制 >[warning] 回收机制会自动找出那些不再继续使用的值,然后释放其占用的内存。但某些情况下(闭包,全局变量),回收机制无法生效。 #### 2.3.1 引用计数法 跟踪记录每个值被引用的次数,声明、赋值时,值引用次数加一,将值赋给其他变量时,引用次数再加一,包含值的变量赋值更改时减一,,在引用次数为0时回收。 ~~~ var a = {}; // 值: 对象{},引用次数: 1 var b = a; // 值: 对象{},引用次数: 1 + 1 a = null; // 值: 对象{},引用次数: 2 - 1 // 此时对象 {} 不会被回收 ~~~ #### 2.3.2 标记清除算法 > 标记:从引用根节点开始标记所有被引用的对象。清除:遍历整个堆,把未标记的对象清除 1. 垃圾收集齐运行时给存储在内存中的所有变量加上标记 2. 从根部触发能触及到的对象的标记清除 3. 还存在的标记的变量被视为准备删除的对象 4. 垃圾收集器摧毁那些带有标记的值并回收他们占用的内存空间 ### 2.4 内存泄漏 程序的运行需要内存,对于持续运行的服务进程,不及时释放不再使用到的内存,会导致内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。