我有一个带有“自动刷新”功能的网页。打开时,每隔一秒通过ajax(称为page_request)获取一个页面,并用提供的containerid替换div容器的内容:
document.getElementById(containerid).innerHTML=page_request.responseText;
这大部分时间都有效,没问题。
当以下脚本位于page_response中时出现问题:
<script type=\"text/javascript\">
$(document).ready(function() {
dtable = $('#multi-stat-table').dataTable();
});
</script>
此脚本使用DataTables jQuery插件将具有id“multi-stat-table”的表转换为可排序表。该脚本有效,我有可排序的表格。但是,如果启用了自动刷新,则会发生内存泄漏,最终会消耗整个堆(缓慢但肯定)。
我可以使用top和chrome的内存分析器看到这种现象。每隔一秒,分配~70 KB数据,但仅释放~20 KB。因此,每秒净丢失50 KB堆内存。我查看了分析器中占用内存的对象,但很难从非描述数字中找出这些数组和对象实际引用的内容。我一直无法弄清楚如何使垃圾收集器收集这些每秒堆积的未使用的对象:
我尝试在每次自动刷新之前将dtable设置为null,但无济于事。我也试过调用dtable.api()。clear()和dtable.api()。destroy(),但泄漏仍然存在。我怎样才能发现这种泄漏,更重要的是,我该怎么做才能阻止它呢?
答案 0 :(得分:1)
我能够确定内存泄漏的确切原因。
当我浏览Chrome的分析器并看到jQuery的缓存对象引用了45 MB的对象时,我首先想到它可能是一个jQuery缓存问题。经过一些研究,这是我读过的文章,帮助我弄清楚如何解决它:http://javascript.info/tutorial/memory-leaks#jquery-anti-leak-measures-and-leaks
在我这样做之前: 的document.getElementById(数据筒).innerHTML = page_request.responseText; //如果jQuery稍后引用了containerid中的任何内容,则会有危险!
修复后: $( “#集装箱”)HTML(page_request.responseText); // html()取消引用在containerid内部缓存的未使用对象
自我注意:混合和匹配jQuery和非jQuery DOM
是危险的