客户机是微信支付 POS 机, 推广款免费摆店里那种, 安卓 8.1, 只有 2G 内存, 启动剩余 900mb 左右, 系统自带的 webview 版本是 61, 应用内置了腾讯 X5 内核, 由于性能问题考虑,程序采取的策略是启动预读取全部需要数据(webview 嘛), 最近发现了部分产线闪退的情况, 我们测试发现是 X5 内核给 webview 分配了一个极低的最大内存(132mb), 导致当程序 webview 占用内存达到 160mb 左右时(实测出来的数据)程序就会因为 GC 被干掉导致闪退
数据来源是通过 performance.memory.jsHeapSizeLimit 获取统计到的
我进行了下测试,编写个测试 html 不间断生成对象,同时记录内存占用一直到闪退,测试发现原生 webview61 默认给分配的是 527.38mb, 腾讯 X5 则只给程序分配了 132.56mb, 严谨起见我安装了个夸克浏览器(webview100)发现夸克也给测试页面分配了 527.38mb(夸克到达极限内存的情况是页面重载而不是闪退)
很奇怪的一点, 感觉这个最大内存限制似乎来自于某项配置但我没找到, 不然没理由夸克和系统的 webview 分配的内存是完全一致的,腾讯 X5 这项就小的离谱了
以下图中数据均来自于 performance.memory , 堆大小和总堆大小可以不用管安卓端 webview 这两项数据是初始页面数据不会刷新, 最终占用内存是调试模式查看的, 所有图片全部是 闪退/重载前 最后一刻拍的,可以看到夸克和系统 webview 数据很接近基本一致, 证明 performance.memory.jsHeapSizeLimit 确实有参考性
以下为夸克数据(webview100)
以下为系统 webview 数据(webview61)
以下为腾讯 X5 数据(webview89)
1
Cabana 134 天前 via iPhone
夸克用的就是系统内核,跟系统 webview 一样是肯定的
|
3
murmur 134 天前
pos 是要扫码么,扫码用的摄像机很吃资源的,这玩意有可能才是闪退的元凶
现在还真有人刷信用卡啊,不都是绑着码刷卡么 |
4
retrocode OP @murmur 不是扫码,测试页面单纯生成对象占内存,达到 160mb 也会闪退,当然闪退不是核心问题,这种销售软件连重载都是不能接受的,我司主要是开便利店的,要同时兼容 windows 和安卓,所以核心选的 webview 。主要是问题设备是支付宝和微信支付送的,所以配置很低。
|
5
retrocode OP @murmur 核心问题是无论如何 x5 分配的 130mb 也太低了,即使现在优化好了后续还是得注意此类问题。很费解,都不知道 x5 哪里配置有问题( x5 也没多少配置……)
|
6
bagel 133 天前
你们接入 x5 应该有对接人吧,找他们问问。x5 改不了还有个办法:用 svelte 这种框架,内存占用能比 react 低 50%,当然你得做好别内存泄漏。
|
7
IvanLi127 133 天前
一百多兆也不算太小。chromium 是能调,x5 不了解,这个限制一般就是浏览器内核限的,x5 应该是得能调,不然就太半成品了
|
8
liu731 133 天前
android:largeHeap="true"
|
9
okakuyang 133 天前
我没仔细研究过安卓这边的情况,我推测一下。如果你用系统 webview 和 chromewebview ,夸克浏览器不是一项以体积小闻名吗?估计没有带 webview 内核,是调用的系统的 chrome webview 。其中系统 webview 和 chrome webview 都是被系统支持的可选组件,他们的进程是独立于你的 App 的,如果内存爆了,被系统杀掉,是不影响你主 App 的进程的,所以表现是重载。(这一点 iOS 上是这样的,iOS 的 webview 内存限制是 300M )但是你用腾讯 x5 的话,可能它是作为动态库和你 App 一起加载的,是和你主 App 绑在一起的,webview 占用的内存和你 App 的内存是一起算的,那么当然它不可能设置那么大,因为你主 App 还要使用一部分内存。因为 x5 现在也不怎么维护了,使用起来也有不可调和的矛盾,我现在是不用 x5 了,我现在用的是第三方开发者维护的一个 cosswalk 项目,或者用火狐的内核。缺点是安装包体积会增加 50 多兆左右,优势是 webview 版本新一点,但是关于这两个内存限制我没有去了解。
|
10
kimzn33251 133 天前
你的 webview 被杀死时,app 处于前台还是后台,一般说来处于前台不会被系统干掉,因为你有最高的进程优先级,所以我对你说的干掉不是很明确。还是说你的 app OOM 了,表现出来是闪退,这需要抓一下 crash 日志看下具体错误再进一步分析。
|
11
retrocode OP @kimzn33251 无需其他分析了, 就是内存分配的问题, 这我截图里提到的 https://supermario.vip/test.html 测试页面纯生成对象, 写了 demo 启动直接访问, 甚至在 X5 内核 demo 和 系统自带浏览器里 访问结果都是一样的.
|