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=

随便看看

IDEA安装及破解永久版教程————鹏鹏

---恢复内容开始---首先,让我们介绍一下IDEA是什么?IDEA,全称IntelliJIDEA,是一个用于java编程语言开发的集成环境。IDEA是总部位于捷克共和国首都布拉格的JetBrains公司的产品,该公司的开发人员主要是以严谨著称的东欧程序员。⑨ 启动IntelliJIDEA并输入以下激活代码以激活。首先,打开进入IDEA主界面。在顶部,打开H...

docsify制作在线说明文档的轻量级神器

我找到了一个使用html处理和加载md文件的网站。创建一个漂亮的在线描述文档(工件docsify)非常简单,nav可以删除--˃ENChinese加载window$docsify={el:'#main',//配置节点loadSidebar:true,//设置是否加载sidebarsubMaxLevel:2,//设置最大目录级别coverpage:true;/...

fullcalendar日历控件知识点集合

除非对于极少的特殊需求,fullcalendar向我们提供的接口不足以满足,才会去改动fullcalendar本身的js文件。这些会议安排一般是保存在server的,在每次页面载入时,fullcalendar得到会议安排的集合,然后依照当中的日期去把事件描绘到日历相应的地方。...

更改nexus的工作目录

默认情况下,nexus的工作目录位于${user_home}/sonatype工作目录中。在Linux中,如果用户是root用户,则使用/root/sonatype。这便于通过war将nexus安装到servlet容器中,但不利于服务器的集中管理。这需要更改默认的nexus工作目录位置。为了方便管理,您可以选择使用环境变量。...

Fiddler抓包7-post请求(json)(转载)

2.查看上图中的红色框:这里只支持application/x-www-form-urlencoded格式的body参数,即json格式。您需要检查JOSN列中的five和xml。1.如果遇到text/xml格式的正文,如下图所示...

Selenium操作示例——鼠标悬停显示二级菜单,再点击二级菜单或下拉列表

这两天在python中玩selenium时,我遇到了一个问题,那就是鼠标移动到页面上的一个按钮或菜单,二级菜单或下拉菜单自动弹出,然后二级菜单或者下拉列表自动点击。...