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=

随便看看

virsh 连接虚拟机 (vnc 或 控制台)

第一种方法:1.如果虚拟机登录方法是VNC,请在ubuntu机器上安装vncviewer。在虚拟机的配置xml中,安装vncviewer$apt-geinstallvncviewer以查看虚拟机的端口地址$virshvncdisplaycontroller通过端口地址显示:0...

react 中echarts-for-react使用 自适应div

import*asReactfrom'react'importReactEchartsfrom'charts-for-ract'导出接口IProps{}接口IState{}classCapitalBudgetsextendsReact.Component<IProps,IState>{constructor(props:IProps){super(props...

NodeJs使用jwt生成token以及使用express-jwt校验和解密token

=0){//当数据库有当前用户时,它返回tokenlettoken=jwt.sign;res.send}else{res.send}}catch{//p抛出异常并将其发送到错误中间件以处理console.log;next;}})//注册接口路由器。post('/register',异步(req,res,next)=˃{let{用户名,密码,昵称}=req-b...

阿里巴巴开源性能监控神器Arthas初体验

今天跟大家介绍一款阿里巴巴开源的性能分析神器Arthas官方网站:https://alibaba.github.io/arthas/index.htmlArthas能为你做什么事情呢?接下来,我们找个项目实际体验一下Arthas。﹏﹏﹏﹏上述几个命令只是性能测工作中常用的一些操作,Arthas还有很多其他维度的监控数据,大家可以去官网看下用户手册学习更多操作...

Java 读取ANSI文件中文乱码问题解决方式[转]

Filefile=newFile(路径);InputStreamin=newjava.io.FileInputStream(文件);BufferedReader读取器=新的BufferedReader(读取);FileInputStreamin=newFileInputStream(文件);byte[]b=新字节[3];内容如下(b);...

微信小程序生成带参数的二维码(小程序码)独家asp.net的服务端c#完整代码

1) 我第一次使用wx。小程序端请求调用API,发现这是一个坑!@-_~Page:'pages/index/index',//在此处填写要跳转到的小程序页面。你不能在它前面添加/oh。发布后必须为1024页//小程序代码的边长,以像素为单位,范围[2801280]},标头:{'content-type':“application/json;charset=U...