接手了一个项目,利用threejs绘制自动驾驶相关的一些信息,陆陆续续添加了几个小功能。七月初的时候突然反馈说是网站崩溃了,当时第一反应就是内存过大超过限制。
Chrome限制了使用的内存极限(64位为1.4GB,32位为1.0GB),V8需要保证JavaScript应用逻辑与垃圾回收器所看到的不一样,V8在执行垃圾回收时会阻塞 JavaScript应用逻辑,直到垃圾回收结束再重新执行JavaScript应用逻辑,这种行为被称为“全停顿”(stop-the-world)。 若V8的堆内存为1.5GB,V8做一次小的垃圾回收需要50ms以上,做一次非增量式的垃圾回收甚至要1秒以上。这样浏览器将在1s内失去对用户的响应,造成假死现象。如果有动画效果的话,动画的展现也将显著受到影响。
因为用了websocket推送消息,打印的日志很多,以为是这块影响了,所以第一次尝试修复时去除所有日志。 结果问题并没有解决, 还是很稳定的每隔1个多小时崩溃一次。
第二次开始从代码中查找, 一般会认为是内存泄漏, 网上查找比较典型的内存泄漏案例, 发现项目中并没有类似的代码。这时想到chrome自带内存分析工具, 录了几个包后确实是几M的增长。 但是对比后发现新增的东西实在太多,没有什么实质的意义, 因为一直在不停的创建和渲染。只不过下次更新的时候会释放掉,内存增长曲线增长的也很缓慢,隔一段时间也会降下来一点。
最后没其他好办法,通过注释代码一点一点的查找, 期间内存增长的很慢, 而且可能是我的电脑性能比较好,一直没有崩溃过,所以心里其实也不是很确定到底是不是内存的问题。
联想到最近修改的功能, 全部注释掉,然后加快websocket推送的速度,最后发现是创建导向箭头的时候是在更新地图的时候触发的,然而地图会不定时更新,开发的时候用的测试数据没触发这个功能。 最后就导致每更新一次地图就重新绘制一遍所有的导向箭头,而之前的也没有去除销毁,导致内存一直上涨。
__END__
文章出处:网页崩溃及卡顿Bug修复
作者签名:简单地活着, 肆意又精彩.
关于主题:Hexo - Live For Code
版权声明:文章除特别声明外,均采用 BY-NC-SA 许可协议,转载请注明出处