Angelo Lee's Blog
This is my kingdom .If i don't fight for it ,who will ?

1.问题说明:

由于机器内存小,所以很是关注内存的使用情况,经常打开任务管理器查看。启动chrome浏览器,观察任务管理器,你会发现起了多个chrome进程。chrome.exe的进程数量与实际你打开的chrome浏览器窗口数量的悬殊差距。那么到底这些进程都有什么用呢?

2.问题原因:

谷歌浏览器占用很多系统进程来使每个网站进程之间相互独立,chrome利用这一点将网络应用以及插件放在浏览器本身的每个子进程中。基本上,每个标签都有一个进程,除非这些进程是来自同一个子域的。比如说渲染器就有着其本身的进程,每个插件以及其扩展功能也都有其自身的进程。这就意味着一个网络应用的渲染引擎崩溃不会影响整个浏览器或者其他的网络应用,操作系统可以并行运行网络应用来增强他们的响应能力,浏览器自身不会因为某个网络应用或者插件停止响应而停止工作。这也就意味着我们可以在开发时利用沙箱(一个安全的执行受限制的环境)来运行渲染引擎进程,减少意外操作而导致损失的几率。

3.Chrome进程体系说明:

Chrome最核心的部件主要有三个:Browser、Renderer、Webkit。Browser控制了所有的I/O、网络传输、浏览器主界面等工作,Renderer主要负责渲染工作,并由Browser进程驱动,Chrome支持每一个Renderer为一个独立进程模式,也就是在Chrome中看到的每一个Tab页面都可以是一个独立进程,某一个Tab页面Crash,不影响其他页面的运行。Renderer进程的实际渲染工作由Webkit库来完成。

下图就是Google官网上公布的Chrome多进程示意图。

chrome_multiprocess

Google在宣传的时候一直都说,Chrome是one tab one process的模式。实际上,Chrome支持的进程模型远比宣传丰富。简单的说,Chrome支持以下几种进程模型:

1. Process-per-site-instance:就是你打开一个网站,然后从这个网站链开的一系列网站都属于一个进程。这是Chrome的默认模式

2. Process-per-site: 同域名范畴的网站放在一个进程,比如www.google.com和www.google.com/bookmarks就属于一个域名内(google有自己的判定机制),不论有没有互相打开的关系,都算作是一个进程中。用命令行--process-per-site开启。

3. Process-per-tab:这个简单,一个tab一个process,不论各个tab的站点有无联系,就和宣传的那样。用--process-per-tab开启。

4. Single Process:这个很熟悉了吧,传统浏览器的模式,没有多进程只有多线程,用--single-process开启。

 

Chrome包含了一个Browser进程和多个Renderer进程。当然还包含了上图中未反馈出来插件进程,在Chrome中每一个插件也是一个独立的进程。

每一个Renderer进程中都包含了一个RenderProcess对象,其主要工作是负责Renderer进程和Browser的通讯。对应的在Browser进程中为每一个Renderer进程提供了一个RenderProcessHost对象(Renderer进程中包含了不同类型的RenderProcessHost对象)。这个对象负责与各个Renderer进程通讯。Browser进程和Renderer进程之间的通讯采用IPC方式(Inter-process Communication)。

Chrome的进程模型中Process-per-site-instanceProcess-per-site两种模式下,多个Tab页面同属于一个进程。为了适应这种情况,Chrome提供了另外的解决方案。在每一个Renderer进程中,包含了一个或者多个RenderView对象,这个对象被RenderProcess对象管理。每一个Tab页面就是一个RenderView。但在Process-per-site-instanceProcess-per-site两种模式下,有可能多个Tab页面都同属于一个Renderer进程。被同一个RenderProcess对象管理。为了区分每一个RenderView,Renderer进程为每一个RenderView分配了一个viewID,这个ID在同一个Renderer进程内是唯一的。但不保证全局唯一。每一个RenderView与Browser进程通讯时,必须提供RenderProcess对象和ViewID两个信息,才能指示当前的RenderView。对应的在Browser进程中也包含了一个RenderViewHost对象,负责与Renderer进程中的RenderView对象通讯。

4.查看Chrome进程

打开Chrome后,选择输入about:memory或者chrome://memory-redirect/可以查看Chrome的进程和内存情况。

image

可以利用谷歌浏览器自身所带的任务管理器查看谷歌浏览器的每个小进程,具体操作:按Shift + Esc或者“设置->工具->任务管理器”

SNAGHTML2b87a6a

5.解决问题:

可以通过减少扩展和插件来减少进程。

扩展管理:

可以进入扩展管理,删除或者临时禁用一些扩展来减少进程。方法“设置->工具->扩展理器”

image

6.插件管理:

可以进入插件管理,删除或者临时禁用一些插件来减少进程。方法about:plugins或者chrome://plugins/

image

posted on 2013-11-02 22:38  Angelo Lee  阅读(1560)  评论(0编辑  收藏  举报