We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
执行beforeUnload事件,卸载当前页面
URL 解析
如果是文本,则拼接成默认搜索引擎加关键字的 URL 进行搜索
如果是 URL 就进行页面访问请求,并加上协议头(http、https 的区别)
encodeURI 与 encodeURIComponent
encodeURI
encodeURIComponent
判断是否存在缓存
DNS解析
建立连接
HTTP连接
HTTPS连接
传输数据
301/302
根据 Content-Type 来判断响应文件类型
断开连接
结果渲染
根据HTML构建 DOM 树
样式计算(Recalculate Style)
布局
创建布局树
布局计算
分层
思想
什么样的 ReaderLayer 会被绘制成 GraphicsLayer
图层绘制
栅格化(raster)
合成
显示
重排(回流)
当通过JS或者 CSS 修改元素的几何属性,例如改变元素的宽度、高度等,那么浏览器会触发重新布局,解析之后的一系列子阶段,这个过程就叫重排
重排需要更新完整的渲染流水线,所以开销也是最大的
触发条件
优化方案
重绘
通过JS或者 CSS 修改元素的绘制属性,例如改变元素的背景颜色,那么布局阶段将不会被执行,因为并没有引起几何位置的变换,所以就直接进入了绘制阶段(即生成待绘制列表),然后执行之后的一系列子阶段,这个过程就叫重绘
重绘省去了布局和分层阶段,所以执行效率会比重排操作要高一些
更改一个既不要布局也不要绘制的属性,渲染引擎将跳过布局和绘制,只执行后续的合成操作,我们把这个过程叫做合成
比如我们使用了 CSS 的 transform 来实现动画效果,这可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作
在非主线程上合成,并没有占用主线程的资源,另外也避开了布局和绘制两个子阶段,所以相对于重绘和重排,合成能大大提升绘制效率。
缓存策略
强缓存
浏览器判断本地缓存未失效,直接取本地数据,不发起HTTP请求,http返回状态码是200(from memory cache或者from disk cache)
请求头
Pragam/Expires(1.0)
Cache-Control(1.1)
Expires和Cache-Control的区别
协商缓存
浏览器发送请求给服务端,服务端返回304,提示缓存未失效
If-Modified-Since/Last-Modified(1.0)
过程
缺点
If-None-Match/Etag(1.1)
Nginx ETag计算方式
ETag有两种类型
强ETag
弱ETag
存储位置
Service Worker
使用过程
生命周期
installing(安装中)
installed(安装后)
activating(激活中)
activated(激活后)
redundant(废弃)
Memory Cache
Disk Cache
Push Cache
HTTP/2 提供的缓存,session 关闭缓存就释放
特性
用户行为对浏览器缓存的控制
内存缓存和硬盘缓存有什么区别?
内存缓存(from memory cache)
快速读取
时效性
JS,字体,图片等会放在内存缓存中
硬盘缓存(from disk cache)
为什么CSS会放在硬盘缓存中?
存储方式
cookie
用途
参数
key
value
expires
path
domain
secure
webStorage
localStorage
sessionStorage
indexedDB
一个非关系型数据库,数据形式使用的是json
适合存储大量数据,它的API是异步调用的
特点
操作方式
协议、域名、端口只要有一个不同即是跨域。
导致跨域的方式
DOM同源策略
XMLHttpRequest同源策略
为何要有跨域限制
保证用户信息的安全,防止恶意的网站窃取数据
同源限制范围
没有限制的标签
document.domain
IFRAME
片段标识符
片段标识符(fragment identifier)指的是,URL的#号后面的部分
父窗口可以把信息,写入子窗口的片段标识符。var src = originURL + '#' + data; document.getElementById('myIFrame').src = src;
子窗口通过监听 hashchange 事件得到通知。
window.onhashchange = checkMessage; function checkMessage() { var message = window.location.hash; // ... }
window.name
浏览器窗口有window.name属性。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。
父窗口先打开一个子窗口,载入一个不同源的网页,该网页将信息写入window.name属性。window.name = data;
接着,子窗口跳回一个与主窗口同域的网址。location = 'http://parent.url.com/xxx.html';
然后,主窗口就可以读取子窗口的window.name了。var data = document.getElementById('myFrame').contentWindow.name;
优点
缺点:
跨文档通信API(Cross-document messaging)
新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。
父窗口http://aaa.com向子窗口http://bbb.com发消息
var popup = window.open('http://bbb.com', 'title'); popup.postMessage('Hello World!', 'http://bbb.com');
子窗口向父窗口发送消息
父窗口和子窗口都可以通过message事件,监听对方的消息。
window.addEventListener('message', function(e) { console.log(e.data); },false);
API
message事件的事件对象event,提供以下三个属性
可以通过event.source给发送者回复信息
window.addEventListener('message', receiveMessage); function receiveMessage(event) { event.source.postMessage('Nice to see you!', '*'); }
AJAX
WebSocket
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。
浏览器发出的WebSocket请求的头信息
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
因为有了Origin这个字段,所以WebSocket才没有实行同源政策。因为服务器可以根据这个字段,判断是否许可本次通信。如果该域名在白名单内,服务器就会做出如下回应。
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
JSONP
原理
jsonp的安全性
CORS
简单请求
什么是简单请求
HEAD、GET、POST三种方法中的其中一种
Http的请求头只能包括
基本流程
浏览器在请求头中增加一个Origin属性,表明本次请求来源那个源(协议+域名+端口)
服务器收到请求后根据这个值决定请求返回
浏览器根据上面返回的请求头中是否包含Access-Control-Allow-Origin判断是否成功
相关头信息
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Foo
Content-type: text/html
非简单请求
对服务器有特殊要求的请求,如方法是PUT或DELETE,或者Content-Type是applcation/json
“预检”请求。
服务器对预检确认
预检失败
预检成功
浏览器收到服务器对预检请求的确认
客户端
Access-Control-Request-Method
Access-Control-Request-Headers
服务端
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Max-Age
load事件与DOMContentLoaded事件
当 DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片。
当 onload 事件触发时,页面上所有的DOM,样式表,脚本,图片都已经加载完成了
css加载是否会阻塞dom树渲染
Web 页面安全
同源策略
DOM 层面
数据层面
限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据
页面可以引用第三方资源(存在XSS 的安全问题),因此又在这种开放的基础之上引入了 CSP (内容安全策略)来限制其自由程度
网络层面
浏览器常见攻击方式(XSS和CSRF)
xss(跨站脚本攻击)
XSS 注入的方法
在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
<input type="text" value="<%= getParameter("keyword") %>"> <button>搜索</button> <div> 您搜索的关键词是:<%= getParameter("keyword") %> </div>
在内联的 JS 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
<script> var initData = <%= data.toJSON() %> </script>
在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
在标签的 href、src 等属性中,包含 javascript: 等可执行代码
<a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳转...</a>
在 onload、onerror、onclick 等事件中,注入不受控制代码。
本质
XSS 攻击的分类
存储型
反射型
DOM 型
危害
预防
预防存储型和反射型 XSS 攻击
纯前端渲染,把代码和数据分隔开
对 HTML 做充分转义
预防 DOM 型 XSS 攻击
防止Cookie被盗用,使用 HttpOnly 属性
csrf(跨站请求伪造)
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
CSRF攻击流程
类型
GET类型的CSRF
POST类型的CSRF
<form action="http://bank.example/withdraw" method=POST> <input type="hidden" name="account" value="xiaoming" /> <input type="hidden" name="amount" value="10000" /> <input type="hidden" name="for" value="hacker" /> </form> <script> document.forms[0].submit(); </script>
链接类型的CSRF
CSRF的特点
阻止不明外域的访问
同源检测
异步请求会携带origin和referer头信息,用于表示信息来源域名,且不能进行修改,由浏览器自动附带。
Origin在以下两种情况下并不存在
IE11同源策略
302重定向
提交时要求附加本域才能获取的信息
Token
所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击
将CSRF Token输出到页面中
页面提交的请求携带这个Token
对于get请求,在URL后面加上这个token
对于post请求,要在form中加入一个隐藏的input域
服务器验证Token是否正确
双重Cookie验证
Samesite Cookie
为Set-Cookie响应头新增Samesite属性,它用来标明这个 Cookie是个同站 Cookie,同站Cookie只能作为第一方Cookie,不能作为第三方Cookie,Samesite 有两个属性值,分别是 Strict 和 Lax
同站 Cookie
Set-Cookie: foo=1; Samesite=Strict Set-Cookie: bar=2; Samesite=Lax Set-Cookie: baz=3
foo严格模式
bar宽松模式
这个请求是这种请求(改变了当前页面或者打开了新页面)且同时是个GET请求
当用户从 a.com 点击链接进入 b.com 时,foo 这个 Cookie 不会被包含在 Cookie 请求头中,但 bar 和 baz 会
从 a.com 发起的对 b.com 的异步请求,或者页面跳转是通过表单的 post 提交触发的,则bar也不会发送
浏览器网络安全
HTTPS协议
浏览器系统安全
为了提高安全性,浏览器的采用了多进程架构。并且提供了安全沙箱和站点隔离来进一步加强安全
多进程架构
安全沙箱
利用操作系统提供的安全技术,让渲染进程在执行过程中无法访问或者修改操作系统中的数据,在渲染进程需要访问系统资源的时候,需要通过浏览器内核来实现,然后将访问的结果通过 IPC 转发给渲染进程
持久存储
网络访问
用户交互
站点隔离
V8 内存构成
新生代内存区(new space)
老生代内存区(old space)
大对象区(large object space)
代码区(code space)
map 区(map space)
垃圾回收技术
全停顿(Stop The World)
垃圾回收算法在执行前,需要将应用逻辑暂停,执行完垃圾回收后再执行应用逻辑
增量垃圾回收(Incremental)
主线程间歇性的去做少量的垃圾回收的方式
并行标记(Parallel)
并发标记(Concurrent)
Chrome当前使用的技术
垃圾回收的方式
标记清除(mark and sweep)
引用计数
跟踪记录每个值被引用的次数
该方式会引起内存泄漏
JS里的垃圾回收机制
栈的垃圾回收机制
堆的垃圾回收机制
特征
V8 把堆分为新生代和老生代
存储对象
内存大小
所用垃圾回收器
副垃圾回收器
负责新生区的垃圾回收
Scavenge 算法
具体步骤
标记
复制
翻转
为什么新生代空间比较小
怎么优化空间小的问题
对象晋升策略
主垃圾回收器
负责老生区的垃圾回收
回收方式
对象特征
从一组根元素开始,递归遍历这组根元素,在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据
V8使用每个对象的两个mark-bits和一个标记工作栈来实现标记
具体扫描步骤
清除
标记 - 整理
面向服务的架构
各种模块会被重构成独立的服务(Service),访问服务(Service)必须使用定义好的接口,通过 IPC 来通信
每个服务(Service)都可以在独立的进程中运行
可以轻松拆分为不同的进程或聚合为一个进程
当Chrome在功能强大的硬件上运行时,它可能会将每个服务拆分为不同的进程以提供更高的稳定性
在资源受限的设备上,Chrome会将服务整合到一个进程中以节省内存。
Chrome的进程
Browser进程
GPU进程
渲染进程
将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中
默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下
线程
GUI渲染线程
JS引擎线程
事件触发线程
定时触发器线程
异步http请求线程
网络进程
第三方插件进程
utility进程
主进程临时需要做一些不方便的任务的情况下,可以启动一个utility进程来代替主进程执行
主进程与utility进程之间通过IPC消息来通信
UI进程
存储进程
设备进程
Audio进程
Video进程
Profile进程
Browser进程和浏览器内核(Renderer进程)的通信过程
Browser进程收到用户请求
Renderer进程的Renderer接口收到消息,简单解释后,交给渲染线程,然后开始渲染
Browser进程接收到结果并将结果绘制出来
The text was updated successfully, but these errors were encountered:
No branches or pull requests
浏览器
渲染过程
执行beforeUnload事件,卸载当前页面
URL 解析
如果是文本,则拼接成默认搜索引擎加关键字的 URL 进行搜索
如果是 URL 就进行页面访问请求,并加上协议头(http、https 的区别)
encodeURI 与 encodeURIComponent
encodeURI
encodeURIComponent
判断是否存在缓存
DNS解析
建立连接
HTTP连接
HTTPS连接
传输数据
301/302
根据 Content-Type 来判断响应文件类型
断开连接
结果渲染
根据HTML构建 DOM 树
样式计算(Recalculate Style)
布局
创建布局树
布局计算
分层
思想
什么样的 ReaderLayer 会被绘制成 GraphicsLayer
图层绘制
栅格化(raster)
合成
显示
重绘、回流、合成
重排(回流)
当通过JS或者 CSS 修改元素的几何属性,例如改变元素的宽度、高度等,那么浏览器会触发重新布局,解析之后的一系列子阶段,这个过程就叫重排
重排需要更新完整的渲染流水线,所以开销也是最大的
触发条件
优化方案
重绘
通过JS或者 CSS 修改元素的绘制属性,例如改变元素的背景颜色,那么布局阶段将不会被执行,因为并没有引起几何位置的变换,所以就直接进入了绘制阶段(即生成待绘制列表),然后执行之后的一系列子阶段,这个过程就叫重绘
重绘省去了布局和分层阶段,所以执行效率会比重排操作要高一些
触发条件
优化方案
合成
更改一个既不要布局也不要绘制的属性,渲染引擎将跳过布局和绘制,只执行后续的合成操作,我们把这个过程叫做合成
比如我们使用了 CSS 的 transform 来实现动画效果,这可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作
在非主线程上合成,并没有占用主线程的资源,另外也避开了布局和绘制两个子阶段,所以相对于重绘和重排,合成能大大提升绘制效率。
触发条件
优化方案
缓存
缓存策略
强缓存
浏览器判断本地缓存未失效,直接取本地数据,不发起HTTP请求,http返回状态码是200(from memory cache或者from disk cache)
请求头
Pragam/Expires(1.0)
Cache-Control(1.1)
Expires和Cache-Control的区别
协商缓存
浏览器发送请求给服务端,服务端返回304,提示缓存未失效
请求头
If-Modified-Since/Last-Modified(1.0)
过程
缺点
If-None-Match/Etag(1.1)
过程
Nginx ETag计算方式
ETag有两种类型
强ETag
弱ETag
存储位置
Service Worker
使用过程
生命周期
installing(安装中)
installed(安装后)
activating(激活中)
activated(激活后)
redundant(废弃)
Memory Cache
Disk Cache
Push Cache
HTTP/2 提供的缓存,session 关闭缓存就释放
特性
用户行为对浏览器缓存的控制
内存缓存和硬盘缓存有什么区别?
内存缓存(from memory cache)
快速读取
时效性
JS,字体,图片等会放在内存缓存中
硬盘缓存(from disk cache)
为什么CSS会放在硬盘缓存中?
浏览器存储
存储方式
cookie
用途
缺点
参数
key
value
expires
path
domain
secure
webStorage
localStorage
sessionStorage
indexedDB
一个非关系型数据库,数据形式使用的是json
适合存储大量数据,它的API是异步调用的
特点
操作方式
跨域
协议、域名、端口只要有一个不同即是跨域。
导致跨域的方式
DOM同源策略
XMLHttpRequest同源策略
为何要有跨域限制
保证用户信息的安全,防止恶意的网站窃取数据
同源限制范围
没有限制的标签
cookie
document.domain
IFRAME
片段标识符
片段标识符(fragment identifier)指的是,URL的#号后面的部分
父窗口可以把信息,写入子窗口的片段标识符。var src = originURL + '#' + data;
document.getElementById('myIFrame').src = src;
子窗口通过监听 hashchange 事件得到通知。
window.name
浏览器窗口有window.name属性。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。
父窗口先打开一个子窗口,载入一个不同源的网页,该网页将信息写入window.name属性。window.name = data;
接着,子窗口跳回一个与主窗口同域的网址。location = 'http://parent.url.com/xxx.html';
然后,主窗口就可以读取子窗口的window.name了。var data = document.getElementById('myFrame').contentWindow.name;
优点
缺点:
跨文档通信API(Cross-document messaging)
新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。
父窗口http://aaa.com向子窗口http://bbb.com发消息
子窗口向父窗口发送消息
父窗口和子窗口都可以通过message事件,监听对方的消息。
API
message事件的事件对象event,提供以下三个属性
可以通过event.source给发送者回复信息
AJAX
WebSocket
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。
浏览器发出的WebSocket请求的头信息
因为有了Origin这个字段,所以WebSocket才没有实行同源政策。因为服务器可以根据这个字段,判断是否许可本次通信。如果该域名在白名单内,服务器就会做出如下回应。
JSONP
原理
缺点
jsonp的安全性
CORS
简单请求
什么是简单请求
HEAD、GET、POST三种方法中的其中一种
Http的请求头只能包括
基本流程
浏览器在请求头中增加一个Origin属性,表明本次请求来源那个源(协议+域名+端口)
服务器收到请求后根据这个值决定请求返回
浏览器根据上面返回的请求头中是否包含Access-Control-Allow-Origin判断是否成功
相关头信息
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Foo
Content-type: text/html
非简单请求
对服务器有特殊要求的请求,如方法是PUT或DELETE,或者Content-Type是applcation/json
基本流程
“预检”请求。
服务器对预检确认
预检失败
预检成功
浏览器收到服务器对预检请求的确认
相关头信息
客户端
Access-Control-Request-Method
Access-Control-Request-Headers
服务端
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Max-Age
WebWorker与SharedWorker
面试题
load事件与DOMContentLoaded事件
当 DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片。
当 onload 事件触发时,页面上所有的DOM,样式表,脚本,图片都已经加载完成了
css加载是否会阻塞dom树渲染
浏览器安全
Web 页面安全
同源策略
DOM 层面
数据层面
限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据
页面可以引用第三方资源(存在XSS 的安全问题),因此又在这种开放的基础之上引入了 CSP (内容安全策略)来限制其自由程度
网络层面
浏览器常见攻击方式(XSS和CSRF)
xss(跨站脚本攻击)
XSS 注入的方法
在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
在内联的 JS 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
在标签的 href、src 等属性中,包含 javascript: 等可执行代码
在 onload、onerror、onclick 等事件中,注入不受控制代码。
本质
XSS 攻击的分类
存储型
反射型
DOM 型
危害
预防
预防存储型和反射型 XSS 攻击
纯前端渲染,把代码和数据分隔开
对 HTML 做充分转义
预防 DOM 型 XSS 攻击
防止Cookie被盗用,使用 HttpOnly 属性
csrf(跨站请求伪造)
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
CSRF攻击流程
类型
GET类型的CSRF
POST类型的CSRF
链接类型的CSRF
CSRF的特点
预防
阻止不明外域的访问
同源检测
异步请求会携带origin和referer头信息,用于表示信息来源域名,且不能进行修改,由浏览器自动附带。
Origin在以下两种情况下并不存在
IE11同源策略
302重定向
提交时要求附加本域才能获取的信息
Token
所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击
原理
将CSRF Token输出到页面中
页面提交的请求携带这个Token
对于get请求,在URL后面加上这个token
对于post请求,要在form中加入一个隐藏的input域
服务器验证Token是否正确
双重Cookie验证
Samesite Cookie
为Set-Cookie响应头新增Samesite属性,它用来标明这个 Cookie是个
同站 Cookie
,同站Cookie只能作为第一方Cookie,不能作为第三方Cookie,Samesite 有两个属性值,分别是 Strict 和 LaxSet-Cookie: foo=1; Samesite=Strict Set-Cookie: bar=2; Samesite=Lax Set-Cookie: baz=3
foo严格模式
bar宽松模式
这个请求是这种请求(改变了当前页面或者打开了新页面)且同时是个GET请求
当用户从 a.com 点击链接进入 b.com 时,foo 这个 Cookie 不会被包含在 Cookie 请求头中,但 bar 和 baz 会
从 a.com 发起的对 b.com 的异步请求,或者页面跳转是通过表单的 post 提交触发的,则bar也不会发送
浏览器网络安全
HTTPS协议
浏览器系统安全
为了提高安全性,浏览器的采用了多进程架构。并且提供了安全沙箱和站点隔离来进一步加强安全
多进程架构
安全沙箱
利用操作系统提供的安全技术,让渲染进程在执行过程中无法访问或者修改操作系统中的数据,在渲染进程需要访问系统资源的时候,需要通过浏览器内核来实现,然后将访问的结果通过 IPC 转发给渲染进程
持久存储
网络访问
用户交互
站点隔离
垃圾回收机制
V8 内存构成
新生代内存区(new space)
老生代内存区(old space)
大对象区(large object space)
代码区(code space)
map 区(map space)
垃圾回收技术
全停顿(Stop The World)
垃圾回收算法在执行前,需要将应用逻辑暂停,执行完垃圾回收后再执行应用逻辑
缺点
增量垃圾回收(Incremental)
主线程间歇性的去做少量的垃圾回收的方式
优点
缺点
并行标记(Parallel)
并发标记(Concurrent)
Chrome当前使用的技术
垃圾回收的方式
标记清除(mark and sweep)
引用计数
跟踪记录每个值被引用的次数
该方式会引起内存泄漏
JS里的垃圾回收机制
栈的垃圾回收机制
堆的垃圾回收机制
特征
V8 把堆分为新生代和老生代
存储对象
内存大小
64位下64MB
64位下1400MB
所用垃圾回收器
副垃圾回收器
负责新生区的垃圾回收
Scavenge 算法
具体步骤
标记
复制
翻转
为什么新生代空间比较小
怎么优化空间小的问题
对象晋升策略
主垃圾回收器
负责老生区的垃圾回收
回收方式
对象特征
具体步骤
标记
从一组根元素开始,递归遍历这组根元素,在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据
V8使用每个对象的两个mark-bits和一个标记工作栈来实现标记
具体扫描步骤
清除
标记 - 整理
Chrome浏览器架构
优点
缺点
面向服务的架构
各种模块会被重构成独立的服务(Service),访问服务(Service)必须使用定义好的接口,通过 IPC 来通信
每个服务(Service)都可以在独立的进程中运行
可以轻松拆分为不同的进程或聚合为一个进程
当Chrome在功能强大的硬件上运行时,它可能会将每个服务拆分为不同的进程以提供更高的稳定性
在资源受限的设备上,Chrome会将服务整合到一个进程中以节省内存。
Chrome的进程
Browser进程
GPU进程
渲染进程
将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中
默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下
线程
GUI渲染线程
JS引擎线程
事件触发线程
定时触发器线程
异步http请求线程
网络进程
第三方插件进程
utility进程
主进程临时需要做一些不方便的任务的情况下,可以启动一个utility进程来代替主进程执行
主进程与utility进程之间通过IPC消息来通信
UI进程
存储进程
设备进程
Audio进程
Video进程
Profile进程
Browser进程和浏览器内核(Renderer进程)的通信过程
Browser进程收到用户请求
Renderer进程的Renderer接口收到消息,简单解释后,交给渲染线程,然后开始渲染
Browser进程接收到结果并将结果绘制出来
The text was updated successfully, but these errors were encountered: