Javascript 使用d3转换会导致内存泄漏

Javascript 使用d3转换会导致内存泄漏,javascript,d3.js,memory-leaks,Javascript,D3.js,Memory Leaks,我在d3.js的帮助下进行了可视化。可视化使用了大量转换(例如显示/隐藏/移动元素)。我注意到,随着时间的推移,CPU负载很高,内存大量增加,这使得可视化在一段时间后变得非常缓慢 因此,我删除了过渡,或者用一个自制的具有较慢帧速率的过渡函数替换它们。不幸的是,删除所有转换不是一个选项,因为这会使可视化更不美观。其余过渡是通过增大/减小圆半径而出现和消失的圆 但似乎仍然存在内存泄漏,大部分在chrome中可见(根据windows任务管理器,10分钟内有20000K内存泄漏) 所以我想知道是否是转换

我在d3.js的帮助下进行了可视化。可视化使用了大量转换(例如显示/隐藏/移动元素)。我注意到,随着时间的推移,CPU负载很高,内存大量增加,这使得可视化在一段时间后变得非常缓慢

因此,我删除了过渡,或者用一个自制的具有较慢帧速率的过渡函数替换它们。不幸的是,删除所有转换不是一个选项,因为这会使可视化更不美观。其余过渡是通过增大/减小圆半径而出现和消失的圆

但似乎仍然存在内存泄漏,大部分在chrome中可见(根据windows任务管理器,10分钟内有20000K内存泄漏)

所以我想知道是否是转换本身导致了内存泄漏。为了测试这一点,我制作了一个jsfiddle(),以查看单独一个类似的转换是否会显示相同的结果。确实如此:在Chrome中运行时,内存每10分钟增加约9500K(基于windows任务管理器)

d3转换本身是否可能以某种方式增加内存使用?还是我使用d3转换的方式不对?

我一直在研究Chrome开发工具,但它并没有真正帮助我:

  • 时间线显示了内存使用的锯齿状模式(但其下降值随时间而增加)
  • 堆时间线显示,大多数(数组)(编译代码)的对象都在增加,并且保留了最大的大小。当我展开它们时,它们也包含很多项,但是探查器中显示的项对我来说没有意义
  • 此外,堆时间表上的峰值(可能是由转换引起的)随着时间的推移越来越高
  • 堆快照的大小增加不多,但在比较快照之间分配的对象时,我看到的是相同的(数组)(编译代码)

这似乎与d3.js无关,但与windows上的chrome(38)有关。已经运行了一个多小时,windows任务管理器中测量的内存使用量从56M增加到133M。在另一个浏览器(例如IE 10)上,同一个提琴不会上升,但平衡在3700万左右。

手动触发垃圾收集时似乎没问题。无论如何,内存泄漏似乎是由赋值
var t=setTimeout(…)引起的var t
并仅设置超时时,我的内存将继续增加(:根据windows任务管理器,大约每10分钟10000公里)。制作这个JSFIDLE是为了查看内存是否随着时间的推移而随着圆圈的转换而增加。因为我最初的可视化包含了许多随着时间的推移出现和消失的圆圈,并且显示了类似的内存增加。如果这不是测试这个的正确方法,你还有其他建议吗?我想说的是我不能在Ubuntu上用Chrome37复制这个。我让它运行了几分钟,垃圾收集后内存没有增加。谢谢你的帮助。我已经和其他人讨论过了,他们确认小提琴在Ubuntu上不会增加内存,但在Windows上会增加。。。此外,它在IE10上没有显示,在Firefox33上也没有显示。因此,我认为它与d3.js无关,而是与windows上的chrome(?)有关。。。
g_svg = d3.select("#visualization")
    .append("svg")
    .attr("width", 300)
    .attr("height", 300);

circle = g_svg.append("circle")
            .attr("cx", 150)
            .attr("cy", 150)
            .attr("r", 0)
            .style("opacity", 0.3)
            .style("fill", "orange");

resize();

function resize(){
    circle.transition()
        .duration(500)
        .attr("r", 100)
        .transition()
        .delay(750)
        .duration(500)
        .attr("r", 0)
    var t = setTimeout(function(){resize()}, 1500);
}