2014-08-29 66 views
3

我有一个具有“自动刷新”功能的网页。当打开时,每隔一秒一个页面是通过AJAX(称为page_request)获取与所提供的数据筒替换一个div容器的内容:Javascript泄漏的诊断类型

document.getElementById(containerid).innerHTML=page_request.responseText; 

这工作的大部分时间,没有任何问题。

的问题出现时,下面的脚本是在page_response:

<script type=\"text/javascript\"> 
    $(document).ready(function() { 
     dtable = $('#multi-stat-table').dataTable(); 
    }); 
</script> 

这个脚本打开表中的ID“多-STAT表”到一个排序表使用数据表jQuery插件用。脚本起作用,并且我有可排序的表格。但是,如果启用自动刷新,则会有内存泄漏,最终会占用整个堆(缓慢但肯定)。

我可以看到使用top和chrome的内存分析器的这种现象。每秒钟,〜70 KB的数据被分配,但只有〜20 KB被释放。因此,每秒有50 KB的堆内存损失。我查看了剖析器中正在占用内存的对象,但很难从非描述数字中找出这些数组和对象实际引用的内容。我一直无法弄清楚如何使垃圾收集器收集堆积如山每秒这些未使用的对象:

Memory Leak

我已经试过每个自动刷新之前设置dtable为null,无济于事。我也尝试调用dtable.api()。clear()和dtable.api()。destroy(),但是泄漏仍然存在。我怎样才能找到这个漏洞,更重要的是,我能做些什么来阻止它呢?

+0

从包含脚本标记到中间服务器坚持HTML片段甚至一次,更不用说每分钟一次,似乎是一种非常有创意的方式,会导致各种不好的事情发生。 – 2014-09-03 16:00:08

+0

我知道,但它是“遗留代码” – RPGillespie 2014-09-04 14:39:26

回答

1

我能够查明内存泄漏的确切原因。

我第一次有想法,它可能是一个jQuery缓存问题,当我浏览Chrome的分析器时,发现jQuery的缓存对象引用了45 MB值的对象。一些研究之后,这是我读的文章,帮助我弄清楚如何解决它:http://javascript.info/tutorial/memory-leaks#jquery-anti-leak-measures-and-leaks

我这样做之前: 的document.getElementById(数据筒).innerHTML = page_request.responseText; //如果containerid中的任何内容稍后会被jQuery引用,那么将是危险的!

修复之后: $(“#container”)。html(page_request.responseText); // HTML()取消引用数据筒的内部缓存使用的对象

自我提醒:这可能是危险的混合和匹配jQuery和非jQuery的DOM