如何在IE中强制进行Javascript垃圾回收? 在AJAX调用和DOM操作之后,IE的行为非常慢
我有一个带有链式下拉菜单的页面。 从第一个select
选择一个option
填充第二个option
从第二个select
选择一个option
将使用页面上空div
上的innerHtml
函数返回匹配结果的表。
问题是,一旦我做出选择并且大量数据被带到页面上,页面上的所有后续Javascript运行exception缓慢。 看起来我通过AJAX拉回来填充div
所有数据仍然占用了大量内存。 我在调用innerHtml
之后尝试将包含AJAX结果的返回对象设置为null
但没有运气。
当我使用Javascript将大量数据插入DOM时,Firefox,Safari,Chrome和Opera都没有显示性能下降,但在IE中它非常明显。 为了测试它是一个Javascript / DOM问题而不是一个普通的旧IE问题,我创建了一个页面版本,它返回初始加载的所有结果,而不是通过AJAX / Javascript,并发现IE没有性能问题。
仅供参考,我正在使用jQuery的jQuery.get方法来执行AJAX调用。
编辑这是我正在做的事情:
function onFinalSelection() { var searchParameter = jQuery("#second-select").val(); jQuery.get("pageReturningAjax.php", {SEARCH_PARAMETER: searchParameter}, function(data) { jQuery("#result-div").get(0).innerHtml = data; //jQuery("#result-div").html(data); //Tried this, same problem data = null; }, "html"); }
我想要指出,当返回data
非常大时,这只会成为一个问题。 它与大小直接相关,因为我能够看到中等大小结果的适度减速,并且当返回几百条记录时只会出现大幅减速。
使用
$("#result-div").html(data);
html()
利用jQuery的empty
方法,该方法非常难以防止内存泄漏。
你有没有尝试过:
delete data;
我认为你的代码中存在其他性能问题导致缓慢。 您的返回数据是否使用具有Alpha透明度的png? 我已经看到杀死IE6(当应用alphafilter时)并显着减慢IE7。
您可以使用CollectGarbage函数强制IE中的垃圾收集,例如
if (typeof(CollectGarbage) == "function") CollectGarbage();
本博客文章中详细介绍了JScript垃圾收集器: http : //blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx
正如博客所说,GC是不可预测的,因此删除数据或data = null 不会立即回收内存,但最终会收回它。
但我怀疑你的性能损失是否真的是由内存使用造成的; 我认为这是DOM渲染的问题。
如果有人不仅对IE感兴趣:
在Gecko强制垃圾收集:
window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindowUtils) .garbageCollect();
链接