Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 583

基于同步通知机制的Chrome浏览器在Android系统上的内存优化

$
0
0

作为目前最受欢迎的一款浏览器,Chrome给用户带来了丰富的功能和体验。与此同时,Chrome常常因为内存使用不当而成为大家关注的焦点。尤其在内存配置较少的Android设备上,系统由于内存被Chrome大量占用,常常会引起性能的降低,甚至最终导致应用程序的崩溃。

作为移动操作系统,Android系统自己其实有一套行之有效的内存管理机制,或者说有两种机制驱动共同起作用。首先是内核(kernel)驱动的LMK(Low Memory Killer)机制,这部分是由Linux内核的Out-Of-Memory(OOM)Killer机制演变而来。其机制简单来说就是当内存紧张时,Android 内核会根据一定的判断条件,根据进程优先级杀死低优先级进程,达到强制回收内存的目的;另一套是Android 框架(Framework)驱动的内存管理机制。为了避免进程最终被强制杀死而影响用户体验,Android框架允许进程注册相关的内存通知接口(ComponentCallbacks2 API),接收来自框架的内存使用情况的通知。通常情况下,Android 框架针对不同的进程把内存紧张程度分成7个等级,这样进程就根据当前系统内存紧张程度和自己所处的优先级,提前主动释放一些不必要的内存,从而延迟或避免内存被系统强制回收。

做为运行在Android设备上一个复杂应用,Chrome浏览器在Android系统的内存管理机制上,做了自己的对接和扩展。首先是Chrome中专门有一个线程利用MemoryPressureListener类来分发内存通知,通过异步的方式,把来自Android框架的内存使用情况分发通知到相关模块,比如2D渲染引擎Skia、布局(layout)引擎Blink以及JavaScript引擎V8等等。每个模块在收到通知后会主动提前释放一些不必要的内存。其次,尽管Chrome浏览器能同时打开多个网页,但任何时候用户总使用其中某一个页面。这样Chrome根据一定的策略把某些长时间不用的页面暂时挂起,尽量释放不必要的内存;而当用户切换到被挂起页面时,再按需要分配内存重新初始化。

尽管如此,由于Android框架的内存使用情况是用异步方式通知的,这样就无法保证在内存紧张的时候,进程有足够多的时间来传递通知和主动释放不必要的内存。因此当进程或者相关模块忙于执行其他任务时,他们就不能及时响应内存通知和优化内存占用,最终导致内存被强制回收和进程被杀死。我们在实际工作中就发现了这样的问题,我们调查了40个常用网站(见图1),发现15% (6个)的网站内存通知延误响应的现象比较严重(>0.5秒),在某些严重延误的情况下(见图2),可以看到由于内存通知响应甚至被JavaScript计算给延误了2.5秒,最终导致了Android设备上Chrome浏览器的崩溃。针对这个暴露出来的问题,我们对某些延误比较严重的模块,增加了同步通知的接口MemoryPressureListener::SyncNotify,让来自Android框架的紧急内存通知得到及时的响应,从而有效的减少了进程内存使用。在我们的测试中,当打开某些复杂网站时,Chrome浏览器崩溃的概率从优化前的50%降低了到了优化后的20%,优化幅度竟达50%以上。

 

Sample time series carbon monoxide sensor plot
图 1. 常见网站的内存消息响应延迟

Sample time series carbon monoxide sensor plot
图 2. 内存消息响应延迟的典型表现

 

作者简介:

郑宏

英特尔亚太研发有限公司Web技术及优化中心软件工程师;
长期从事浏览器的性能分析和优化工作,主要领域包括page loading和memory

 

 

 

 

 

韩骏超

现就任于英特尔亚太研发有限公司Web技术和优化中心软件工程师;
专注于浏览器渲染方面的性能分析和优化。

 


Viewing all articles
Browse latest Browse all 583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>