【发布时间】:2014-08-06 18:50:49
【问题描述】:
我正在处理一个严重依赖网络音频和 ScriptProcessorNodes 的大型项目。在最近的一些间歇性崩溃之后,我找到了 ScriptProcessorNodes 内存泄漏的问题。我已经阅读了很多教程、指南、错误报告等,但似乎都没有帮助。这是一个小玩具示例:
var context = new webkitAudioContext();
function killNode(node)
{
return function()
{
node.disconnect();
node.onaudioprocess = null;
node = null;
}
}
function noise()
{
var node = context.createScriptProcessor(1024, 0, 1);
node.onaudioprocess = function(e)
{
var output = e.outputBuffer.getChannelData(0);
for(var i = 0; i < 1024; ++i)
{
output[i] = (Math.random() * 2 - 1) * 0.001;
}
}
node.connect(context.destination);
setTimeout(killNode(node), 100);
}
function generateNoise()
{
for(var i = 0; i < 99999; ++i)
{
noise();
}
}
generateNoise();
这将启动许多节点,然后断开它们并将它们的 onaudioprocess 设置为 null。根据我的阅读,鉴于我没有保留对它们的任何引用,它们不应该被垃圾收集吗?
我的计算机内存跃升到 16% 左右,稍后稳定到 14%,但从未低于此值。谁能给我看一个与此类似的示例,其中节点被正确收集?我有什么明显的遗漏吗?
【问题讨论】:
-
为什么一次有这么多节点,而且只有 100 毫秒?非玩具示例是否也会产生静态?
-
嗨 Andrew,这是一个更大问题的玩具示例。我永远不会一次真正分配那么多节点。相反,我在一个较大的项目中遇到了内存泄漏问题,其中许多项目是在很长一段时间内分配的。这最终会导致标签崩溃。我相信这可能是 Chrome 中的一个错误,我在 [这里] (code.google.com/p/chromium/issues/…) 提交了一个错误报告如果有人确认我会给出答案
标签: memory-leaks web-audio-api