一、回顾
在之前的文章《 Chrome浏览器初始启动时的六个进程 》中渲染进程(Renderer Process)的作用是负责一个Tab内的显示相关的工作。简单的理解一个Tab,就会有一个Renderer Process,这些进程之间的内存无法进行共享,而不同进程的内存常常需要包含相同的内容。而实际我们也得到两种结果:
1.一个Tab下是可以不止一个渲染进程
2.多个Tab可包含在同一个渲染进程
并非每个Tab页都一定会有自己的一个进程,而这取决于浏览器设置的进程模型是什么。
二、四种进程模式(Process Models)
Chrome为了节省内存,提供了四种进程模式(Process Models),不同的进程模式会对 tab 进程做不同的处理。
进程模式 | 模式说明 |
---|---|
Process-per-site-instance (default) | 同一个 site-instance 使用一个进程 |
Process-per-site | 同一个 site 使用一个进程 |
Process-per-tab | 每个 tab 使用一个进程 |
Single process | 所有 tab 共用一个进程 |
这里需要给出 site 和 site-instance 的定义:
site 和 site-instance 的定义
site: 指的是相同的 registered domain name(如: http://google.com ,http://bbc.co.uk)和scheme (如:https://)。比如http://a.baidu.com和http://b.baidu.com就可以理解为同一个 site(注意这里要和 Same-origin policy 区分开来,同源策略还涉及到子域名和端口)。
site-instance: 指的是一组 connected pages from the same site,这里 connected 的定义是 can obtain references to each other in script code 怎么理解这段话呢?满足下面两中情况并且打开的新页面和旧页面属于上面定义的同一个 site,就属于同一个 site-instance
用户通过<a target=“_blank”>这种方式点击打开的新页面
JS代码打开的新页面(比如 window.open)
下面比较四个进程模式:
Single process
顾名思义,单进程模式,所有tab都会使用同一个进程。接下来是Process-per-tab ,也是顾名思义,每打开一个tab,会新建一个进程。而对于Process-per-site,当你打开 http://a.baidu.com 页面,在打开 http://b.baidu.com 的页面,这两个页面的tab使用的是共一个进程,因为这两个页面的site相同,而如此一来,如果其中一个tab崩溃了,而另一个tab也会崩溃。
Process-per-site-instance
是最重要的,因为这个是 Chrome 默认使用的模式,也就是几乎所有的用户都在用的模式。当你打开一个 tab 访问 http://a.baidu.com ,然后再打开一个 tab 访问 http://b.baidu.com,这两个 tab 会使用两个进程。而如果你在 http://a.baidu.com 中,通过JS代码打开了 http://b.baidu.com 页面,这两个 tab 会使用同一个进程。
Chome浏览器使用Process-per-site-instance作为默认的进程模式呢,兼容了性能与易用性,是一个比较中庸通用的模式。相较于 Process-per-tab,能够少开很多进程,就意味着更少的内存占用。相较于 Process-per-site,能够更好的隔离相同域名下毫无关联的 tab,更加安全。