Egret社区

[Bug已解决] eui下面的控件,貌似有内存泄漏啊

2016-1-14 17:14
354612
产品 Egret Engine 版本 3.0.1
复现概率 100% 平台 Windows 浏览器
复现步骤 用上面这段代码创建,内存会不断变大,无法恢复。
用sprite创建,内存变化没这么夸张。
截图是多执行几遍的结果
问题描述 eui控件,内存溢出
错误代码 for(var i = 0 ; i < 50000; i++){
var x = new eui.Component()
this.addChild(x)
this.removeChild(x)

//var x = new egret.Sprite();
//x.graphics.beginFill(0x00ff00, 1);
//x.graphics.drawRect(0, 0, 100, 80);
//x.graphics.endFill();
//this.addChild(x)
//this.removeChild(x)

console.log("i = ", i)
}
BUG截图
麻烦尽快确认下吧
分享到 :
0 人收藏

12 个回复

倒序浏览
dom  圆转纯熟 | 2016-1-20 10:50:30
陈策 发表于 2016-1-20 09:00
我在写项目的时候也会用map保存数据,不用时delete,看了你的解释,被delete属性的对象会为成慢对象,改 ...

改成阶段性定时清理,一般都有个时间点可以确认所有子项都是空的了,然后一次性创建一个新的Object,所有缓存都清空了,而且没有调用过delete。比如这里,其实map主要是为了缓存一下提高查询速度,所以是伴随着有一个数组来存储对象的,一般这个数组长度等于0的时刻,把map重新创建一个对象就行了。性能非常高,也不影响正常使用。
dom  圆转纯熟 | 2016-1-14 20:58:37
调试了好长时间,最后定位到问题了,就是两行代码,注释掉就不泄露了。但并不是代码写的有问题。因为最后查看时那两个对象内容都是空的。查看内存占用,也没有出现任何引擎内的类,排最顶上的全是内置类型,数组,字符串,object这些。非常奇怪,可能触发了v8什么奇怪的bug,我们继续排查一下如何能绕过这个问题。 AC4E32AC-F894-4F7E-9048-6CB1F680F26F.png
dom  圆转纯熟 | 2016-1-15 09:09:24
最后找到问题了,调试工具的问题,那个map实际上不是空的。但是chrome的调试工具里输出看着是空的。这里确实写的有问题,用map来当高速查询缓存用,把显示对象唯一的hashCode数字设置在map上标记true标识注册过。最早的写法是会随后调用delete一个个hashCode去删除的,但是发现调用delete会照成性能明显下降,来自网上的资料:「被delete属性的对象会退化成慢对象,内存占用大15倍。」所以改成置为false。而这里照成的内存泄露,某种程度上说,只有这个例子故意这么写测试才会出现泄露。因为每增加一个全新的对象到显示列表,map的key会获得一个新的hashCode。所以增加的只是map上的一个数字key。而不是具体的某个对象泄露了。而map上的key增加比例大概是这样:50000个新对象,会照成10M额外内存(如果是50000个对象泄露,内存占用远远不会是10M)。而通常使用情况下,显示对象都是静态复用的,一直维持在比较稳定的数量,即使新创建数量也很难会达到这个值。所以通常情况下这个问题影响都不大。但是太多了确实影响查询性能,又失去缓存的意义了,我们换一种方式实现吧。另外同时排查一下所有类似的用法。感谢反馈~
xtutu  登堂入室 | 2016-1-15 09:58:36
本帖最后由 xtutu 于 2016-1-15 10:06 编辑
dom 发表于 2016-1-15 09:09
最后找到问题了,调试工具的问题,那个map实际上不是空的。但是chrome的调试工具里输出看着是空的。这里确 ...

辛苦啦!这个内存泄漏的问题,实际上是这样发现的。我正常进入一个设置了自己皮肤的 eui.Component里面。然后再退出这个界面。重复这个步骤五六次,就发现内存增加了几百kb。然后再多试几次,又增加了几百kb。
所以写了这样一个例子,来测试。
dom  圆转纯熟 | 2016-1-15 11:00:01
xtutu 发表于 2016-1-15 09:58
辛苦啦!这个内存泄漏的问题,实际上是这样发现的。我正常进入一个设置了自己皮肤的 eui.Component里面。 ...

确实是写的不对,我们改一改。优化出一个最佳性能的方式。
xtutu  登堂入室 | 2016-1-15 11:01:48
dom 发表于 2016-1-15 11:00
确实是写的不对,我们改一改。优化出一个最佳性能的方式。


幸苦啦
dom  圆转纯熟 | 2016-1-15 18:27:57

已经改好提交啦。在master分支上,等下次发版本的时候就出去了。
陈策  登堂入室 | 2016-1-20 09:00:41
dom 发表于 2016-1-15 18:27
已经改好提交啦。在master分支上,等下次发版本的时候就出去了。

我在写项目的时候也会用map保存数据,不用时delete,看了你的解释,被delete属性的对象会为成慢对象,改为修改值为false又会慢慢加大内存。你们现在的解决方案是怎么样的?想学习下。
爱尚的多  禁止发言 | 2016-1-24 21:51:04
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

xtutu

登堂入室

积分: 10 帖子: 9 精华: 0

楼主热帖

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部