需要解决的实际问题:我正在开发一个大型应用程序,其初始版本大约是两年前发布的。我们现在正在向应用程序添加一个新页面,并注意到一些奇怪的行为。新屏幕将成为“永远在线”状态屏幕,这意味着它是应用程序中的默认屏幕,应用程序运行的专用PC将始终显示在默认情况下。经过一段时间(在IE浏览器上只有几分钟,Chrome上通常要长得多),事情开始行为不端。首先,滚动消息(如果有的话)的动画变得不稳定和缓慢,最终到达它们看起来移动大约1个像素/秒的程度。在我们使用的机器上,IE中的碎片会在几分钟内开始,并且在几个小时内会慢慢爬行。到那时,其他奇怪的行为已经开始:浏览器本身反应迟钝。此屏幕上有一个菜单/登录按钮,在点击任何内容之前有3-4秒的延迟。其他视觉元素在更新之前具有类似的延迟,即使它们与用户没有交互。
我和团队中的其他人花了几天时间查看此页面上的所有内容,并且认为我们将原因缩小到我们用于轮询数据的服务中的内存泄漏。它出现在我们使用该服务的每个页面上,但我们认为症状只是新屏幕上的一个问题,因为有大量的视觉提示(滚动,更新图标/颜色等),许多它有一些密集的处理/图形,在数据更新时每个周期都会运行,并且事实上没有人可能让其他屏幕保持运行一段时间,可能需要开始以较少的时间看到症状勤奋的页面。
我在Chrome的开发者工具中采用了时间轴截图,这就是它的样子。在使用我们的轮询服务的每个页面上看起来类似。
我创建了一个demo of just the polling,并得到了一个类似的图表:。它在演示中看起来不那么严重,但模式显然是相似的,看起来像是内存泄漏。 我们如何解决内存泄漏并消除其他问题?
一些相关代码:
var reload = function() {
$http({
method: 'GET',
url: 'api.txt',
timeout: 5000
})
.success(function(response) {
//do stuff
})
.error(function(data) {
//do other stuff
})
.finally(function() {
timer = $timeout(reload, 1000);
});
};
答案 0 :(得分:0)
你在代码中的某处使用了闭包吗? 由于这些类型的问题仅在使用许多闭包时发生,因为这是java脚本中不会销毁对象的地方,如果你使用太多闭包,最终你将缺少内存。