Chromium 浏览器核心生命周期剖析:从 BrowserProcess 全局管理到 Browser 窗口实例
在 Chromium 浏览器架构中,BrowserProcess
和 Browser
是两个核心类,分别管理 浏览器进程的全局状态 和 单个浏览器窗口的实例。它们的生命周期设计直接影响浏览器的稳定性和资源管理。以下是它们的详细生命周期分析:
1. BrowserProcess
的生命周期
角色
BrowserProcess
是浏览器进程(Browser Process)的单例全局管理器,负责维护跨所有浏览器窗口共享的资源和子系统(如网络、缓存、策略服务等)。
生命周期阶段
-
初始化阶段
-
创建时机:在浏览器进程启动时(
BrowserMainLoop
初始化期间)通过BrowserMainRunnerImpl::Initialize
创建。 -
关键操作:
// chrome/browser/browser_process_impl.cc BrowserProcessImpl::BrowserProcessImpl(): created_browser_process_(true) {// 初始化全局服务(如资源管理器、策略服务)local_state_ = CreateLocalState();network_service_instance_ = std::make_unique<NetworkServiceInstance>(); }
-
-
运行阶段
-
持有多个关键子系统的单例:
-
ResourceCoordinatorService
(资源协调) -
MetricsService
(指标统计) -
ProfileManager
(用户配置管理)
-
-
跨进程通信枢纽:通过
Mojo
接口与其他进程(Renderer、GPU等)交互。
-
-
销毁阶段
-
销毁时机:在浏览器进程退出时(
BrowserMainLoop::ShutdownThreadsAndCleanUp
)销毁。 -
关键操作:
BrowserProcessImpl::~BrowserProcessImpl() {// 按依赖顺序销毁子系统(如先销毁 ProfileManager,再销毁网络服务)profile_manager_.reset();network_service_instance_.reset(); }
-
生命周期特点
-
单例模式:通过
g_browser_process
全局指针访问(base::NoDestructor
保证线程安全)。 -
长生命周期:贯穿整个浏览器进程运行期间。
-
强依赖关系:
Browser
实例依赖BrowserProcess
的子系统(如Profile
)。
2. Browser
的生命周期
角色
Browser
类代表单个浏览器窗口实例(如一个 Chrome 窗口),管理其标签页(TabStripModel
)、地址栏、工具栏等 UI 组件。
生命周期阶段
-
创建阶段
-
触发条件:用户点击“新建窗口”或通过命令行启动新窗口。
-
关键代码:
// chrome/browser/ui/browser.cc Browser::Browser(const CreateParams& params): profile_(params.profile),tab_strip_model_(std::make_unique<TabStripModel>(...)) {// 初始化窗口UI组件window_ = views::Widget::CreateWindowWithContext(...); }
-
-
运行阶段
-
标签页管理:通过
TabStripModel
动态添加/删除标签页。 -
事件响应:处理用户输入(如导航、书签操作)。
-
依赖关系:
-
从
BrowserProcess
获取全局服务(如HistoryService
)。 -
通过
WebContents
与渲染进程(Renderer Process)交互。
-
-
-
销毁阶段
-
触发条件:用户关闭窗口或程序退出。
-
关键操作:
Browser::~Browser() {// 释放标签页资源tab_strip_model_->CloseAllTabs();// 通知观察者(如扩展系统)for (auto& observer : observers_)observer.OnBrowserDestroyed(this); }
-
生命周期特点
-
多实例共存:每个窗口对应一个
Browser
对象。 -
短生命周期:随窗口打开/关闭动态创建和销毁。
-
依赖
Profile
:每个Browser
绑定到一个Profile
(用户配置)。
3. 关键交互与依赖关系
(1) BrowserProcess
对 Browser
的影响
-
资源共享:所有
Browser
实例共享BrowserProcess
的全局服务(如PrefService
)。 -
销毁顺序:
BrowserProcess
必须在所有Browser
销毁后释放(否则会导致依赖的服务提前失效)。
(2) Browser
的跨进程依赖
-
渲染进程:通过
WebContents
管理多个RenderFrameHost
。 -
GPU进程:窗口渲染依赖
viz::Compositor
。
4. 生命周期图示
5. 常见问题与解决方案
问题1:Browser
销毁时资源泄漏
-
原因:未正确释放
WebContents
或监听器。 -
解决:在
Browser::~Browser()
中确保调用tab_strip_model_->CloseAllTabs()
。
问题2:BrowserProcess
子系统的线程安全问题
-
原因:
ProfileManager
可能被多线程访问。 -
解决:通过
base::SequenceChecker
强制单线程访问。
问题3:浏览器崩溃时生命周期中断
-
解决:依赖
Crashpad
捕获崩溃,并在重启后恢复Profile
状态。
6. 总结
类 | 生命周期范围 | 关键依赖 | 线程模型 |
---|---|---|---|
BrowserProcess | 浏览器进程运行期间 | 全局服务(如 NetworkService ) | 主线程(UI线程) |
Browser | 单个窗口打开期间 | Profile , TabStripModel | 主线程(UI线程) |
-
设计原则:
-
BrowserProcess
是稳定的基础设施,生命周期最长。 -
Browser
是动态资源消费者,需严格管理依赖关系。 -
通过
Mojo
和Profile
解耦进程间依赖。
-
相关文章:

Chromium 浏览器核心生命周期剖析:从 BrowserProcess 全局管理到 Browser 窗口实例
在 Chromium 浏览器架构中,BrowserProcess 和 Browser 是两个核心类,分别管理 浏览器进程的全局状态 和 单个浏览器窗口的实例。它们的生命周期设计直接影响浏览器的稳定性和资源管理。以下是它们的详细生命周期分析: 1. BrowserProcess 的生…...

易境通海外仓系统:一件代发全场景数字化解决方案
随着全球经济一体化和消费升级,一件代发业务的跨境电商市场规模持续增长。然而,一件代发的跨境运营也面临挑战,传统海外仓管理模式更因效率低下、协同困难成为业务扩张的瓶颈。 一、一件代发跨境运营痛点 1、多平台协同:卖家往往…...
Flink 非确定有限自动机NFA
Flink 是一个用于状态化计算的分布式流处理框架,而非确定有限自动机(NFA, Non-deterministic Finite Automaton)是一种在计算机科学中广泛使用的抽象计算模型,常用于正则表达式匹配、模式识别等领域。 Apache Flink 提供了对 NFA…...
YoloV9改进策略:卷积篇|风车卷积|即插即用
论文信息 论文标题:《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 论文链接:https://arxiv.org/pdf/2412.16986 GitHub链接:https://github.com/JN-Yang/PConv-SDloss-Data 论文翻译 摘要 https://arxiv.org/pd…...

【Python训练营打卡】day30 @浙大疏锦行
DAY 30 模块和库的导入 知识点回顾: 1. 导入官方库的三种手段 2. 导入自定义库/模块的方式 3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何…...
超越想象:利用MetaGPT打造高效的AI协作环境
前言 在人工智能迅速发展的今天,如何让多个大语言模型(LLM)高效协同工作成为关键挑战。MetaGPT 作为一种创新的多智能体框架,成功模拟了一个真实软件公司的运作流程,实现了从需求分析到代码实现的全流程自动化&#x…...

仿腾讯会议——添加音频
1、实现开启或关闭音频 2、 定义信号 3、实现开始暂停音频 4、实现信号槽连接 5、回收资源 6、初始化音频视频 7、 完成为每个人创建播放音频的对象 8、发送音频 使用的是对象ba,这样跨线程不会立刻回收,如果使用引用,跨线程会被直接回收掉&a…...

虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系
虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level Blueprint)的关系 code review! 参考笔记: 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图&…...
vue3 vite 项目中自动导入图片
vue3 vite 项目中自动导入图片 安装插件配置插件使用方法 安装插件 yarn add vite-plugin-vue-images -D 或者 npm install vite-plugin-vue-images -D配置插件 在 vite.config.js 文件中配置插件 // 引入 import ViteImages from vite-plugin-vue-images;plugins: [vue(),/…...

MTK zephyr平台:系统休眠流程
一、概述: 当内核没有需要调度的东西时,就会进入空闲状态。 CONFIG_PM=y时允许内核调用PM subsys,将空闲系统置于支持的电源状态之一。 Application负责设置唤醒事件,该事件通常是由SoC外围模块触发的中断,例如: SysTick、RTC、计数器、GPIO 并非所有外设在所有电源模式…...

涨薪技术|0到1学会性能测试第71课-T-SQL调优
前面的推文我们掌握了索引调优技术,今天给大家分享T-SQL调优技术。后续文章都会系统分享干货,带大家从0到1学会性能测试。 对T-SQL语句进行调校是DBA调优数据库性能的主要任务,因为不同的查询语句,即使查询出来的结果一致,其消耗的时间和系统资源也有所不同,所以如何使查…...
Spark SQL 之 Antlr grammar 具体分析
src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseLexer.g4 BACKQUOTED_IDENTIFIER: ` ( ~` | `` )* `;src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseParser.g4 queryPrimary:...

Python----目标检测(PASCAL VOC数据集)
一、PASCAL VOC数据集 PASCAL VOC(Visual Object Classes)数据集是计算机视觉领域中广泛使用的一个 标准数据集,用于目标检测、图像分割、图像分类、动作识别等任务。该数据集由 PASCAL(Pattern Analysis, Statistical Modelling …...

LabVIEW汽车CAN总线检测系统开发
CAN(ControllerArea Network)总线作为汽车电子系统的核心通信协议,广泛应用于动力总成、车身控制、辅助驾驶等系统。基于 LabVIEW 开发 CAN 总线检测系统,可充分利用其图形化编程优势、丰富的硬件接口支持及强大的数据分析能力&am…...

MySQL数据库基础 -- SQL 语句的分类,存储引擎
目录 1. 什么是数据库 2. 基本使用 2.1 进入 mysql 2.2 服务器、数据库以及表的关系 2.3 使用案例 2.4 数据逻辑存储 3. SQL 语句分类 4. 存储引擎 4.1 查看存储引擎 4.2 存储引擎的对比 1. 什么是数据库 安装完 MySQL 之后,会有 mysql 和 mysqld。 MySQL …...

二元Logistic回归
二元Logistic回归 在机器学习领域,二元Logistic回归是一种非常经典的分类模型,广泛用于解决具有两类标签的分类问题。Logistic回归通过逻辑函数(Sigmoid函数)将预测结果映射到概率值,并进行分类。 一、Logistic回归 …...
如何从容应对面试?
引言 简历通过了,终于获得这次来之不易面试机会的你,是不是又在思考以下问题:基本礼仪都包括哪些方面?如何在群面中打动面试官?有什么注意事项?在面试的过程中,我们不单单要懂得面试技巧&#…...
如何使用GIT管理项目代码
介绍 Git是目前世界上最流行甚至最好的开源分布式版本控制系统,不论是很小的项目还是很大的项目,它都能有效并且高效的处理项目版本管理,初衷是为了帮助管理linux内核代码而开发的一个开放源码的版本控制软件。 GIT常用分支名称 分支分…...

RHCE 练习三:架设一台 NFS 服务器
一、题目要求 1、开放 /nfs/shared 目录,供所有用户查询资料 2、开放 /nfs/upload 目录,为 192.168.xxx.0/24 网段主机可以上传目录,并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…...

【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】
1. HCI_Read_Local_Supported_Commands 命令介绍 1. 命令介绍(Description) HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host(如 Android 系统中的 Bluetooth stack)获取 Controller(…...
stm32实战项目:无刷驱动
目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频:RCC_Configuration()设置PLL外设时钟使能:TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…...

python打卡训练营打卡记录day30
一、导入官方库 我们复盘下学习python的逻辑,所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库。 1.1标准导入:导入整个库 这是最基本也是最常见的导入方式,直接使用import语句。 # 方式1:导入整…...

2025年- H33-Lc141 --148. 排序链表(快慢指针,快指针先出发一步)--Java版
1.题目描述 2.思路 时间空间复杂度分别为 O(nlogn) 和 O(1),根据时间复杂度想到二分法,从而联想到归并排序;对数组做归并排序的空间复杂度为 O(n),分别由新开辟数组 O(n) 和递归函数调用 O(logn) 组成,而根据链表特性…...

【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化
💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…...
板凳-------Mysql cookbook学习 (四)
综合对比与选择建议 维度 PHP Java Python Ruby Perl 学习门槛 低(适合新手) 高(语法复杂) 低(语法简洁) 中(需理解 Rails 理念) 中(特殊语法…...
【D1,2】 贪心算法刷题
文章目录 不同路径 II整数拆分 不同路径 II 初始化的时候不能整列初始化为1,因为如果有障碍物,后面的都不能到达 也不能整列初始化为0,因为状态转移的时候第一行第一列都没有检查,因此不能部分初始化 整数拆分 需要考虑几种情况…...

算法题(150):拼数
审题: 本题需要我们将数组中的数据经过排序,使得他们拼接后得到的数是所有拼接方案中最大的 思路: 方法一:排序贪心 贪心策略1:直接排序 如果我们直接按照数组数据的字典序进行排序,会导致部分情况出错 eg&…...
Denoising Score Matching with Langevin Dynamics
在自然图像等复杂数据集中,真实数据往往集中分布在一个低维流形上,概率密度函数的梯度(即得分函数)难以定义与估计。为缓解该问题,SMLD 提出使用不同强度的高斯噪声对数据进行扰动,扰动后的数据不再集中于低…...

Docker构建 Dify 应用定时任务助手
概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…...

mongodb管理工具的使用
环境: 远程服务器的操作系统:centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的:通过本地的navicat链接mongoDB,如何打通链接,分2步: 第一步:宝塔-&…...