使用 Web Audio API 创建音频缓冲区时,有一些由 decodeAudioData 方法创建的缓冲区,它们驻留在内存中,显然无法通过 JavaScript 访问。它们似乎在浏览器选项卡的整个生命周期中都存在,并且永远不会被垃圾收集。
我知道这些缓冲区与主线程分开并设置在另一个线程上以进行异步解码。我也知道 API 规范说 decodeAudioData 不应该被允许对同一个输入缓冲区解码两次,我认为这就是为什么保留解码缓冲区和/或编码输入缓冲区的副本的原因。但是,在 Chromecast 等内存有限的设备上,这会导致大量内存积累和 Chromecast 崩溃。
在我的示例代码中,我使用 Ajax 获取 mp3,然后将 arraybuffer 传递给 decodeAudioData 函数。通常在该函数中有一个 onsuccess 回调,它可以将解码的 AudioBuffer 作为参数。但是在我的代码中,我什至没有将其传入。因此,在解码后我也不会对解码的缓冲区执行任何操作。它没有在我的代码中的任何地方引用。它完全留在本机代码中。但是,每次调用此函数都会增加内存分配,并且永远不会释放。例如,在 Firefox 中,about:memory 会显示 Tab 生命周期内的音频缓冲区。非引用应该足以让垃圾收集器摆脱这些缓冲区。
我的主要问题是,是否有任何对这些解码音频缓冲区的引用,比如在 audiocontext 对象中,或者我可以尝试从内存中删除它们的其他地方?或者有没有其他方法可以使这些存储的和无法访问的缓冲区消失?
我的问题与目前关于 decodeAudioData 的所有其他问题都不同,因为我表明即使没有用户存储任何引用,甚至没有使用返回的解码音频缓冲区,也会发生内存泄漏。
function loadBuffer() {
// create an audio context
var context = new (window.AudioContext || window.webkitAudioContext)();
// fetch mp3 as an arraybuffer async
var url = "beep.mp3";
var request = new XMLHttpRequest(); …Run Code Online (Sandbox Code Playgroud)