Extjs4.2使用定时器导致的内存增长(新增补充)

王晓宇1014 发布于 2013/09/27 14:52
阅读 998
收藏 0

我们项目前台使用的是ExtJS4.2.0,在chromium下运行界面。后台使用的是struts2+spring+ibatis的经典组合。

最近发现,当浏览器长时间运行界面时,任务管理器中的浏览器内存会变得很大。

我们的界面在运行时会开几个taskRunner定时器,其中有一个定时器,每隔5秒会使用loadPage方法加载一个store,store会向后台数据库的一张表请求数据用于更新一个grid。我们store采用了分页机制,分页大小为50,没有设置buffered参数。不管后台数据库的这张表条目有无增加,前台浏览器的内存都会涨。

页面还有一些其他的定时器,但是经过测试,只有这一个定时器会导致内存的增长。我已经查了好几天了。求问各位是什么原因导致的?怎么解决?

新增补充:

关于这个问题,我后来又调查了ExtJS的官网。通过搜索官网帖子,发现这是grid组件的一个bug(chart组件也存在相似问题)。参考链接如下:

grid组件:http://www.sencha.com/forum/showthread.php?262279

chart组件:http://www.sencha.com/forum/showthread.php?272436

这个bug目前似乎连官方都没能解决。不知道有什么方法可以规避一下?大家可以来讨论一下。

加载中
0
巨葱
巨葱
每次load后手动清空返回的数据对象
王晓宇1014
问题似乎是出自grid组件,所以我怀疑清空数据对象是否有用。我明天上班也会继续逐步进行实验,你的方法也试试,并把实验结果公布在这里。
0
王晓宇1014

这两天做了各种各样的尝试与实验,发现的确是grid组件的问题。这一组件在执行reconfigure()方法时,只要有数据加载,就会出现内存泄露。

我尝试了一些方法来规避这一问题,包括@出水小葱提到的removeAll清空store,以及将grid组件清除并重新add到容器中,还有使用getView方法获取grid.view然后执行refresh,都失败了。

但也有一些其他的发现。chromium浏览器(我们项目用定制的chromium做展示)具有一定的内存泄露清理能力,只要关闭定时加载数据,过段时间内存会降下来。此外,只要grid组件不在视野内(比如在另一个tab下但是没有展现),也不会造成内存泄露。

总之,看来想要避开这个bug,要么让数据加载时间间隔长一些,给chromium清理内存的时间,要么干脆避免定时加载数据。

返回顶部
顶部