浏览器工作原理与实践学习(一)

浏览器工作原理与实践学习(一),第1张

浏览器工作原理与实践学习(一) 开篇词

一、以后发展
1、脚本执行速度问题 WebAssembly + javascript
2、前端模块化开发 vue react
3、渲染效率问题 chrome 新布局方案[layoutNG](看了一下没咋看懂,感觉写起来有点麻烦)(https://zhuanlan.zhihu.com/p/37847490) 渲染瘦身方案slim paint

宏观视角下的浏览器 一、打开一个chrome页面 4个进程

线程 进程

线程:线程是不能单独存在的,它是由进程来启动和管理的,
进程: 一个进程就是一个程序的运行实例,详细解释就是,启动一个程序的时候, *** 作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。

多线程 : java 并行 — 同一时间处理多个任务,谷歌能同一时间最多处理6个任务 相当于一心二用吧

单线程:javascript 任务代码按照顺序由上到下执行 相当于一心一意


进程和线程之间的关系特点

1. 进程中的任意一线程执行出错,都会导致整个进程的崩溃 2. 线程之间共享进程中的数据。

3. 当一个进程关闭之后, *** 作系统会回收进程所占用的内存。

当一个进程退出时, *** 作系统会回收该进程所申请的所有资源;即使其中任意线程因为 *** 作不当导致内存泄漏,当进程退出时,这些内存也会被正确回收

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
https://blog.csdn.net/hizhangyuping/article/details/80624506 内存泄露的原因和解决方法,关闭浏览器进程,内存会被系统回收

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得***程序运行要用到的内存大于能提供的最大内存***

引起内存溢出的原因有很多种,常见的有以下几种:
  1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  3.代码中存在死循环或循环产生过多重复的对象实体;
  4.使用的第三方软件中的BUG;
  5.启动参数内存值设定的过小;

4. 进程之间的内容相互隔离。 单进程浏览器

运行模块和功能:网络,插件,js运行,css、js动画等渲染引擎和页面等

特点,缺点:不稳定,不流畅,不安全

不稳定:

插件,渲染引擎

不流畅:

除了上述脚本或者插件会让单进程浏览器变卡顿外,页面的内存泄漏也是单进程变慢的一个重要原因。通常浏览器的内核都是非常复杂的,运行一个复杂点的页面再关闭页面,会存在内存不能完全回收的情况,这样导致的问题是使用时间越长,内存占用越高,浏览器会变得越慢。

不安全:插件 页面脚本浏览器漏洞 多进程浏览器

多进程解决了不稳定,不流畅,不安全等各种问题
不流畅
对于内存泄漏的解决方法那就更简单了,因为当关闭一个页面时,整个渲染进程也会被关闭,之后该进程所占用的内存都会被系统回收,这样就轻松解决了浏览器页面的内存泄漏问题。

因为当进程结束,那么系统就会回收它占用的内存。而这里每个页面都有一个自己的渲染进程,所以当关闭页面,该进程占用的内存就都会被回收。 早期单进程浏览器关闭页面的话仅仅是关闭一个线程,并不会回收所有内存。

不安全:安全沙箱

你可以把沙箱看成是 *** 作系统给进程上了一把锁,沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌面。Chrome 把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限。

浏览器进程。主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
渲染进程。核心任务是将 HTML、CSS 和 Javascript 转换为用户可以与之交互的网页,排版引擎 Blink 和 Javascript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
GPU 进程。其实,Chrome 刚开始发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了 GPU 进程。
网络进程。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。
插件进程。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。

缺点:
1、更高的资源占用

因为每个进程都会包含公共基础结构的副本(如 Javascript 运行环境),这就意味着浏览器会消耗更多的内存资源。
2、更复杂的体系架构

浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了。

未来的浏览器模式

将公共的服务抽离,将组件化隔离实现按需进入的低耦合 *** 作

资源不足的时候

早期多线程结构(看着和上面主架构差不多截图出来对比一下,除了ipc的链接就是内部组件化的隔离,多了个GPU进程)

摘自:
极客时间 李兵老师的浏览器工作原理与实践课程
https://time.geekbang.org/column/article/113513

主要也是边学边记录一下

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5719535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存