CEFSharp崩溃分析及解决办法

摘要:
CEFSharp是我们做.NET桌面程序嵌入网站的一大利器,但是它也存在着各种各样的奇葩问题,尤其是遇到机器配置比较低的时候。背景就好比我们项目上的一个客户机上,只安装了4G内存,而且客户开着程序一直不关闭(可能持续了很多天),这样就导致了内存只增不减(当然也有可能是我们前端网站的问题,单页vue程序,用了比较多的全局缓存变量),结果就是导致CEFSharp的其中一个子进程崩掉了,界面变成了白屏。。。这客户一看当然很不爽了,只会认为是我们程序的问题。原因分析经过分析,CEFSharp承载网页时,

CEFSharp是我们做.NET桌面程序嵌入网站的一大利器,但是它也存在着各种各样的奇葩问题,尤其是遇到机器配置比较低的时候。

背景

就好比我们项目上的一个客户机上,只安装了4G内存,而且客户开着程序一直不关闭(可能持续了很多天),这样就导致了内存只增不减(当然也有可能是我们前端网站的问题,单页vue程序,用了比较多的全局缓存变量),结果就是导致CEFSharp的其中一个子进程崩掉了,界面变成了白屏。。。

a5fe2de5a0f34ca199b4b6e6698784b1.png

这客户一看当然很不爽了,只会认为是我们程序的问题。

原因分析

经过分析,CEFSharp承载网页时,它会开启6个名为CefSharp.BrowserSubprocess.exe的子进程,如下:

  • browser

  • gpu-process

  • utility

  • utility

  • renderer

  • renderer

当内存达到上限时(默认大概是1GB左右,64位机器上试验的),gpu-process这个进程就会崩掉,从而导致界面白屏。异常日志信息如下:

ERROR:v8_initializer.cc(688)] V8 javascript OOM: (Reached heap limit).INFO:crash_reporting.cc(211)] Crash reporting enabled for process: gpu-processERROR:gpu_init.cc(481)] Passthrough is not supported, GL is disabled, ANGLE is

 当然你也可以通过杀进程的方式来重现白屏,不过最好还是通过代码的方式来模拟内存溢出比较接近于实际的情况。比如来个for循环拷贝window对象,部分代码如下

<template><div style="display: flex"><input v-model:value="times"></input><button @click="loop()">循环{{ loopData.length }}</button></div></template>export default {name: 'HeapDemo',data() {return {loopData: [],times: 100000,},methods: {loop() {for (let index = 0; index < this.times; index++) {this.loopData.push(Object.assign({}, window));}}}

解决办法

既然是由于内存上限导致的,那么就来给CEFSharp增加内存使用上限,代码如下:

var setting = new CefSettings();//其他代码忽略......//设置浏览器可使用的最大内存值为2GB(2048)setting.CefCommandLineArgs.Add("--js-flags", $"--max_old_space_size=2048");if (!Cef.IsInitialized){Cef.Initialize(setting);}

这样可以最大限度的减少崩溃的几率,还有一种方式就是监控CefSharp.BrowserSubprocess.exe进程,当发现进程数少于6个时,就重新加载CEF浏览器,这样可以避免gpu-process崩溃时,程序界面一直处于白屏状态。

上述都是一种折中方案,虽然不是治本的方式,但是比较有效的快速解决方案。

要想彻底解决,最终还是要从前端源码来分析,减少不必要的内存开销!

 

 

免责声明:文章转载自《CEFSharp崩溃分析及解决办法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows的各种扩展名详解cacti监控部署与配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

安装pywin32模块

“)if__name__==”__main__“:RegisterPy()在保存后输入cmd,切换到存储py文件的目录,执行pythonregisted.py,然后重新运行exe文件以安装pywin32。...

ubuntu18.04 安装新版本openssl

Shared=强制创建共享库。Zlib=使用Zlib库启用压缩。编译过程完成后,使用以下命令安装OpenSSL:sudomakeinstallOpenSSL安装在“/usr/local/ssl”目录中。新的OpenSSL二进制文件将从“/usr/local/ssl/lib”目录加载库文件。转到'/etc/ld。so.conf.d”目录,并创建一个新的配置文件...

泛微E8升级E9代码修改

E8升级E9需要修改后台二次开发的代码,总工作量相当大。CheckCustomize=function(){varnodeId=$.val();//应用程序节点如果{varpgrcontrol=$.val);varfinishpercent=$.vl();如果{如果{Dialog.alert(“进度控制为yes,需要完成百分比!”);return false...

小程序实现单选多选功能

applet的单选组件和复选框组件的样式只提供了变化的颜色,这显然不足以满足实际的项目需求,因此您可以自己模拟。脚注:小程序不支持dom1的操作。多个框的模拟实现:实现思路:想法非常简单。使用选中的属性绑定每个选项。类型为布尔型。单击以反转!...

国产操作系统——银河麒麟V10 SP1使用小结

几天前,我看了国内操作系统Galaxy Kirin有了新更新的新闻,于是我开始了一个新系统=============================================个人评价:这个系统是一个国产操作系统。尽管使用了大量的Ubuntu和Windows设计,使用了Linux内核,但这是国产操作系统从无到有的开始,其意义和价值远远大于其使用价值。总之...

Python-正则

,三:量词*重复0次或多次{0,}+重复一次或多次{1,}?重复0或1次{1,0}{n}重复n次{n}{n,}重复n次,或更多次{n,m}将n次重复到m次Escape:如果字符串中有特殊字符要匹配,请在常规字符和字符串前面添加r。如果特殊字符在字符组中,则它们是匹配的特殊字符,但为了记忆,匹配时会转义所有特殊字符。...